【问题标题】:Write a binary array as bits to a file将二进制数组作为位写入文件
【发布时间】:2020-10-30 19:34:03
【问题描述】:

我在下面有一个二进制 np 数组:

arr = [0. 0. 1. ... 0. 1. 1.]

我想将它写入一个 bin 文件(输出文件名为“test.bin”)。我尝试使用这样的命令:

arr.astype('int8').tofile('test.bin')

但是我发现arr中的每个值都转换为8位。我不想用8位来表示一个数字,因为我需要做NIST sp800-22随机性测试,输入文件必须是bin文件.您能给我一些建议,以便我可以使用 bin 文件中的一位来表示 arr 中的一个数字吗?

谢谢

【问题讨论】:

  • 没有每个元素只使用一位的 numpy dtype。使用现代计算机和内存,位旋转并没有那么有用。几乎所有东西都被塞进 8 字节(64 位)块中。
  • 这能回答你的问题吗? stackoverflow.com/questions/17536411/…

标签: python arrays numpy binary bin


【解决方案1】:

它转换为 int8,因为您使用 .astype('int8') 请求了它。所以不用管它,它应该可以按预期工作。

【讨论】:

  • 我尝试删除 .astype('int8') 并使用 arr.tofile('test.bin'),但没有成功。每个元素由 64 个二进制值组成。我以为是由于np数组元素的类型是float64
【解决方案2】:

最小的内存块是字节。所以一般来说,你甚至不应该这样做。但是,如果您坚持,这里有一个技巧:

import struct
with open("test.bnr", "wb") as f:
    for i in range(0,len(arr),8):
        bin_array = struct.pack('Q', int(''.join(arr[i:i+8].astype(str)), base=2))
        f.write(bin_array)

将您的列表转换为长度为 8 个字节的字符串,然后将字符串转换为单个无符号双精度并将它们写入文件。这会将其保存为最接近的 8 个字节的倍数。当然,您可以使用其他数据类型(单字节,ints = 4bytes,...)来获得您想要的最接近的倍数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多