繁体   English   中英

在python中将整数转换为big endian二进制文件

[英]Convert integer to big endian binary file in python

我试图通过这种方式使用Python将由整数组成的2D数组转换为大端二进制文件:

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]

你知道我的代码有什么问题吗?

首先,整数长度为4个字节。 当您使用struct.pack模块打包整数时,将其强制为2个字节的块,将整数拆分为两个短整数; 具有实际值的一个重要块和具有零的另一个重要块。

因此,当您通过numpy读取它时,它会使用尾随零加载值。

至于如何解决它,只需将格式字符串从'> i2'替换为'> i',同时从numpy打包和加载。 它应该给你预期的结果。

I2替换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)

暂无
暂无

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

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