在 python 中将整数转换为大端二进制文件
Convert integer to big endian binary file in python
我正在尝试使用 Python 将由整数组成的二维数组转换为大端二进制文件:
import struct;
fh=open('file.bin','wb')
for i in range(width):
for j in range(height):
fh.write(struct.pack('>i2',data[i,j]))
fh.close()
当我用 numpy 打开它时:
a=np.fromfile('file.bin',dtype='>i2')
结果是原始数据之间为零的数组:
[266, 0, 267, 0, 268,
0, 272, 0, 268, 0, 264, 0, 266, 0, 264, 0, 263, 0,
263, 0, 267, 0, 263, 0, 265, 0, 266, 0, 266, 0, 267,
0, 267, 0, 266, 0, 265, 0, 270, 0, 270, 0, 270, 0,
272, 0, 273, 0, 275, 0, 274, 0, 275]
这就是我想要获得的:
[266, 267, 268, 272, 268, 264, 266, 264, 263,
263, 267, 263, 265, 266, 266, 267,
267, 266, 265, 270, 270, 270, 272, 273, 275, 274, 275]
你知道我的代码有什么问题吗?
用 I2
替换 i2
对我有用。
a = np.fromfile('file.bin',dtype='>I2')
然后,np.fromfile
的行为看起来很奇怪(它说 >i2
是 int16,但是当你明确地说 np.int16
时它会输出其他东西)。
In [63]: np.fromfile('npfile.bin',dtype='>i2')
Out[63]: array([ 0, 345, 0, 245, 0, 345, 0, 245], dtype=int16)
In [64]: np.fromfile('npfile.bin',dtype=np.int32)
Out[64]: array([1493237760, -184549376, 1493237760, -184549376], dtype=int32)
In [65]: np.fromfile('npfile.bin',dtype=np.uint32)
Out[65]: array([1493237760, 4110417920, 1493237760, 4110417920], dtype=uint32)
In [66]: np.fromfile('npfile.bin',dtype=np.int16)
Out[66]: array([ 0, 22785, 0, -2816, 0, 22785, 0, -2816], dtype=int16)
首先,一个整数是4字节长的。当您使用 struct.pack 模块打包整数时,您将其强制分成 2 个字节的块,将整数分成两个短整型;一个具有实际值的重要块,另一个具有零的重要块。
因此,当您通过 numpy 读取它时,它会加载带有尾随零的值。
至于如何解决它,只需在从numpy打包和加载时将格式字符串从'>i2'替换为'>i'即可。它应该会给你预期的结果。
我正在尝试使用 Python 将由整数组成的二维数组转换为大端二进制文件:
import struct;
fh=open('file.bin','wb')
for i in range(width):
for j in range(height):
fh.write(struct.pack('>i2',data[i,j]))
fh.close()
当我用 numpy 打开它时:
a=np.fromfile('file.bin',dtype='>i2')
结果是原始数据之间为零的数组:
[266, 0, 267, 0, 268,
0, 272, 0, 268, 0, 264, 0, 266, 0, 264, 0, 263, 0,
263, 0, 267, 0, 263, 0, 265, 0, 266, 0, 266, 0, 267,
0, 267, 0, 266, 0, 265, 0, 270, 0, 270, 0, 270, 0,
272, 0, 273, 0, 275, 0, 274, 0, 275]
这就是我想要获得的:
[266, 267, 268, 272, 268, 264, 266, 264, 263,
263, 267, 263, 265, 266, 266, 267,
267, 266, 265, 270, 270, 270, 272, 273, 275, 274, 275]
你知道我的代码有什么问题吗?
用 I2
替换 i2
对我有用。
a = np.fromfile('file.bin',dtype='>I2')
然后,np.fromfile
的行为看起来很奇怪(它说 >i2
是 int16,但是当你明确地说 np.int16
时它会输出其他东西)。
In [63]: np.fromfile('npfile.bin',dtype='>i2')
Out[63]: array([ 0, 345, 0, 245, 0, 345, 0, 245], dtype=int16)
In [64]: np.fromfile('npfile.bin',dtype=np.int32)
Out[64]: array([1493237760, -184549376, 1493237760, -184549376], dtype=int32)
In [65]: np.fromfile('npfile.bin',dtype=np.uint32)
Out[65]: array([1493237760, 4110417920, 1493237760, 4110417920], dtype=uint32)
In [66]: np.fromfile('npfile.bin',dtype=np.int16)
Out[66]: array([ 0, 22785, 0, -2816, 0, 22785, 0, -2816], dtype=int16)
首先,一个整数是4字节长的。当您使用 struct.pack 模块打包整数时,您将其强制分成 2 个字节的块,将整数分成两个短整型;一个具有实际值的重要块,另一个具有零的重要块。
因此,当您通过 numpy 读取它时,它会加载带有尾随零的值。
至于如何解决它,只需在从numpy打包和加载时将格式字符串从'>i2'替换为'>i'即可。它应该会给你预期的结果。