gpt4 book ai didi

python - 如何在python中将任意长度的位串写入二进制文件

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:18 26 4
gpt4 key购买 nike

我需要将一个位串写入二进制文件,该位串并不总是 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 得到相同的结果

提前非常感谢

最佳答案

可以通过将字符串转换为整数并将二进制整数写入文件来解决,如下所示

import os
from array import *

def main():
filename = "test.bin"
bitstring = '10110101111111001101101010011011111010011010110001010101011100010110100010001001110001110100011111010001100011011110010100110000010111101011001011010111111100000110000000001001101000010110000111'
print(bitstring)

# split string to 8 bites long chunks
splits = [bitstring[x:x + 8] for x in range(0, len(bitstring), 8)]
print(splits)

bin_array_in = array('B')
bin_array_out = array('B')

# convert bits to int and add to list
for split in splits:
bin_array_in.append(int(split, 2))

print(bin_array_in)

# dump list to file
with open(filename, "wb+") as f:
bin_array_in.tofile(f)
f.close()

print("file size: {}".format(os.path.getsize(filename)))

# get the list from file
with open(filename, "rb+") as f:
bin_array_out.fromfile(f, len(bin_array_in))
f.close()

print(bin_array_out)

# convert back to bin and join to one string
bitstring = ""
for i in bin_array_out:
bitstring += "{:08b}".format(i, "08b")

print(bitstring)


if __name__ == '__main__':
main()

只有一个问题,最后一个字节用 0 填充以形成 8 位 block 。我不知道更改读/写逻辑是否更容易,或者使您的初始字符串 % 8 更容易,所以我让您弄清楚这部分。

关于python - 如何在python中将任意长度的位串写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57552731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com