python - 如何在python中将任意长度的位串写入二进制文件
问题描述
我需要向二进制文件写入一个位串,它并不总是 8 的倍数。我还需要再次成功地从文件中读取字符串。
字符串的开头永远不会有 0。示例字符串:
bitstring = '10110101111111001101101010011011111010011010110001010101011100010110100010001001110001110100011111010001100011011110010100110000010111101011001011010111111100000110000000001001101000010110000111'
我需要使用尽可能少的存储空间。因此,如果字符串的长度为 194(以上),我需要文件大小为 194//8 + 1 = 25 个字节,尽管我不确定是否可以在 bin 文件中存储非整数字节数。
这是我第一次使用二进制,所以请原谅这种不好的做法。
这是我当前写入文件的解决方案:
with open(filename,"wb+") as f:
f.write(bytes(list(map(int, bitstring))))
f.close()
这要从中读取:
string = "".join(list(map(str,np.fromfile(filename,"u1"))))
使用 EmEditor,字符串中的每个数字都存储为 2 位二进制字符串,这是不可取的。我意识到这可能是因为我将位串拆分为单个数字。这是二进制编辑器中显示的上述位串:
01 00 01 01 00 01 00 01 01 01 01 01 01 01 00 00 01 01 00 01 01 00 01 00 01 00 00 01 01 00 01 01
01 01 01 00 01 00 00 01 01 00 01 00 01 01 00 00 00 01 00 01 00 01 00 01 00 01 01 01 00 00 00 01
00 01 01 00 01 00 00 00 01 00 00 00 01 00 00 01 01 01 00 00 00 01 01 01 00 01 00 00 00 01 01 01
01 01 00 01 00 00 00 01 01 00 00 00 01 01 00 01 01 01 01 00 00 01 00 01 00 00 01 01 00 00 00 00
00 01 00 01 01 01 01 00 01 00 01 01 00 00 01 00 01 01 00 01 00 01 01 01 01 01 01 01 00 00 00 00
00 01 01 00 00 00 00 00 00 00 00 00 01 00 00 01 01 00 01 00 00 00 00 01 00 01 01 00 00 00 00 01
01 01
(所有数字均为2位,文件大小为194字节,即文件/字符串中二进制数的数量)
我尝试使用具有相同结果的 bytearray
非常感谢提前
解决方案
感谢建议使用 bitarray 的 hiro 主角,因为它是我能做的最简单的实现(无法将评论标记为答案)。感谢您的回答,但使用 bitarray 我可以使用最少的代码行来解决它。
这是解决方案:写:
bitstring = "11010101001101010011101"
bitarr = bitarray([0 for _ in range(8-(len(bitstring)%8))] + list(map(int,bitstring)))
with open(filename,"wb+") as f:
bitarr.tofile(f)
读:
with open(filename, "rb") as f:
string = "".join(_reformat_bin(list(map(str,np.fromfile(string,"u1")))))
while not int(string[0]):
string = string[1:]
_reformat_bin() 将表示数字 0-255 的字符串数组转换为表示字节的字符串 arr,例如
>>> _reformat_bin(["255", "0", "9"])
>>> ["11111111", "00000000", "00001001"]
祝大家欢呼。
推荐阅读
- terraform - 如何在嵌套地图上按循环创建集合
- excel - 复制一系列单元格而不是整个工作表
- python - Python Openpyx 自动化引用不断变化的单元格
- python - 如何从网站获取产品详细信息的 json 数据?
- python - 如何在 Python 中将 DNA 序列列表转录为 RNA
- python - ModuleNotFoundError:VSCode 中没有名为“seaborn”的模块
- javascript - WebSocket 与 PHP - 创建多个函数
- android - 重新打开应用程序但服务仍在运行时会删除前台服务通知
- c# - 使用 refit 进行 api 调用后我需要做什么
- git - 本地 git repo 已损坏?所有文件都被识别为新文件并且拉取失败 - 无法锁定引用,引用已损坏