首页 > 解决方案 > 如何在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

非常感谢提前

标签: pythonbinarybytebinaryfiles

解决方案


感谢建议使用 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"]

祝大家欢呼。


推荐阅读