0

这类似于在编程 Stack Exchange 上提出的问题:https ://softwareengineering.stackexchange.com/questions/158247/binary-representation-in-python-and-keeping-leading-zeros

本质上,我有一些以十六进制记录的数字:

SOME_NUMBERS = (0xAABBCCDDEEFF, 0xAA55AA55AA55, 0xBEEF0000BEEF)

然而,Python 试图比我聪明并且想得太多,所以当我将值写入文件时,我会在我的十六进制编辑器中得到这个:

00 00 00 00 00 00 00 00 00 00 AA BB CC DD EE FF

在我看来,Python 将我的 48 位数字存储并写入为 64 位或 128 位数字。如何防止将前导零写入文件?相比之下,当使用 时numpy.random.bytes(6),Python 会将值写入文件而没有前导零,所以我认为它应该能够做到这一点。想法?

4

5 回答 5

2

关键是你如何打包数字。您可以写入单个字节 - 数字格式为 6 个字节是不寻常的。我发现以下内容适用于其中一个值:

import struct

outfile = 'output.dat'
fh = open(outfile, "wb")

var = struct.pack('6B', 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF)

fh.write(var)
fh.close()

如果您使用其他类型,例如 short、int 或 long(或它们的组合),您可能会遇到字节序问题。

于 2013-09-12T12:58:03.803 回答
2

如果要将 48 位二进制值写入文件,则必须自己写入 6 个字节。没有这种长度的本机数字格式。使用struct模块将值转换为字节:

packed = struct.pack('>q', value) # 64 bits (8 bytes)
f.write(packed[-6:])
于 2013-09-12T14:47:06.103 回答
1

为了解决我的问题,我必须做两件事:

1) 切换到 Python 3 2) 使用 int.to_bytes()

f = open(fileName, 'wb')
for d in dataBuffer:
    if type(d) == int:
         f.write(d.to_bytes(6, byteorder='big'))
    else:
         f.write(d)
    f.close()

我不能使用 struct.pack() 或 numpy.savetext(),因为我需要为 2000 个文件处理 10,000 个随机值。这似乎更容易,但我还必须让我的代码与 Python 3 一起工作。我了解到,Python 在努力变得聪明并为用户做事的同时,最终却把事情弄得一团糟并增加了挫败感。

于 2013-09-12T14:36:36.393 回答
0

您可以使用以下命令另存为文本np.savetxt

import numpy as np
sn = np.array([0xAABBCCDDEEFF, 0xAA55AA55AA55, 0xBEEF0000BEEF])
np.savetxt('testfile',sn,'0x%X')

或者

np.savetxt('testfile',sn,'%X') # without the '0x'
于 2013-09-12T13:14:13.127 回答
0

如果您不想使用,可以通过屏蔽源整数的连续字节并将它们转换为字节字符串来struct.pack单独将字节写入文件:chr

for shift in range(40, -1, -8):
    f.write(chr((d >> shift) & 0xff))

但这基本上struct.pack是在引擎盖下(以及在 C 中)为你做的事情,所以你最好不要重新发明轮子。

于 2013-09-12T15:47:42.850 回答