这类似于编程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会将值写入文件而不带前导零,因此它应该能够执行此操作。想法?
答案 0 :(得分: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(或其组合),则可能会遇到endian问题。
答案 1 :(得分:2)
如果要将48位二进制值写入文件,则必须自己写入6个字节。该长度没有本机数字格式。使用struct
模块将值转换为字节:
packed = struct.pack('>q', value) # 64 bits (8 bytes)
f.write(packed[-6:])
答案 2 :(得分: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虽然试图变得聪明并为用户做事,但最终会弄乱一些事情并增加挫折感。
答案 3 :(得分: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'
答案 4 :(得分:0)
如果您不想使用struct.pack
,可以通过屏蔽源整数的连续字节并使用chr
将它们转换为字节字符串来单独将字节写入文件:
for shift in range(40, -1, -8):
f.write(chr((d >> shift) & 0xff))
但这基本上是struct.pack
在幕后(以及在C中)为你做的事情,所以你最好不要重新发明轮子。