Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和整数表示(前导零问题)_Python_Numpy_Integer_Binaryfiles - Fatal编程技术网

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

Python和整数表示(前导零问题),python,numpy,integer,binaryfiles,Python,Numpy,Integer,Binaryfiles,这类似于在编程堆栈交换上提出的问题: 基本上,我有一些我用十六进制记录的数字: 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位数字。如何防止前导零写入文件

这类似于在编程堆栈交换上提出的问题:

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

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(或其组合),则可能会遇到endian问题。

关键是如何打包数字。您可以写入单个字节-数字格式为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问题。

您可以使用
np.savetxt
将其另存为文本:

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


您可以使用
np.savetxt
保存为文本:

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


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

1) 切换到Python 3 2) 使用int.to_字节()


我无法使用struct.pack()或numpy.savetext(),因为我需要为2000个文件处理10000个随机值。这似乎更容易,但我还必须让我的代码与Python3一起工作。我了解到,Python在试图变得聪明并为用户做事情的同时,最终会把事情搞得一团糟,增加挫折感。

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

1) 切换到Python 3 2) 使用int.to_字节()


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

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

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

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

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

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

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

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

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

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

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

您如何
pack
打包数据并写入文件?请展示您的代码,我们(通常)不能盲目猜测问题。在64位平台上,Python将
0xAABBCCDDEEFF
作为64位整数存储在内存中(就像
0x1
甚至
0x0
一样),因此当您写出它时,您将得到64位,除非您自己显式地打包单个字节。您如何
pack
打包数据并写入文件?请显示您的代码,我们(通常)不能盲目地猜测这个问题。在64位平台上,Python将
0xAABBCCDDEEFF
作为64位整数存储在内存中(就像
0x1
甚至
0x0
一样),因此当您写出它时,您将得到64位,除非您自己显式地打包各个字节。很好!我不知道python 3有这个。奥托,对着你大拇指上的锤子大喊大叫也许会让你感觉如释重负,但这并不能真正帮助你。如果说我从这类问题中学到了什么,那就是我自己的假设总是受到质疑。但这对程序员来说可能更重要。stackexchange.com:)太好了!我不知道python 3有这个。奥托,对着你大拇指上的锤子大喊大叫也许会让你感觉如释重负,但这并不能真正帮助你。如果说我从这类问题中学到了什么,那就是我自己的假设总是受到质疑。但这对程序员来说可能更重要。stackexchange.com:)