繁体   English   中英

Python和整数表示法(前导零问题)

[英]Python and integer representation (leading zeros issue)

这类似于在编程堆栈交换上提出的问题: 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会将值写入文件而没有前导零,因此我认为它应该能够执行此操作。 思考?

关键是如何打包数字。 您可以写单个字节-数字格式为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(或其组合),则可能会遇到字节序问题。

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

packed = struct.pack('>q', value) # 64 bits (8 bytes)
f.write(packed[-6:])

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

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(),因为我需要处理2,000个文件的10,000个随机值。 这似乎比较容易,但是我还必须使我的代码能够与Python 3一起使用。我了解到Python在试图变得聪明并为用户做事的同时,最终使事情变得一团糟并增加了挫败感。

您可以使用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'

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

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

但这基本上是struct.packstruct.pack (和C语言)为您执行的操作,因此最好不要重新发明轮子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM