【发布时间】:2016-08-21 09:03:06
【问题描述】:
我在 python 中遇到了struct.unpack 的重大问题。我有一个预先确定格式的二进制文件,可以用 MATLAB 或 Python 编写。
我可以在 Python 中将二进制数据写入文件并毫无问题地读回数据。我还可以将相同的数据从 MATLAB 写入二进制文件,然后在 MATLAB 中毫无问题地读回。
当我从 MATLAB 写入数据并尝试在 Python 中读回数据时,或者当我在 Python 中写入数据并尝试在 MATLAB 中读回数据时,我的问题就出现了。
为简单起见,假设我将两个整数写入二进制文件(大端)。每个整数为 4 个字节。第一个整数是不大于 4 个字节的有效整数,第二个整数必须等于 1、2 或 3。
首先,这是我在 MATLAB 中编写数据的方式:
fid=fopen('hello_matlab.test','wb');
first_data=4+4;
second_data=1;
fwrite(fid,first_data,'int');
fwrite(fid,second_data,'int');
fclose(fid);
这是我在 MATLAB 中读回的内容:
fid=fopen('hello_matlab.test','rb');
first_data=fread(fid,1,'int');
second_data=fread(fid,1,'int');
fprintf('first data: %d\n', first_data);
fprintf('second data: %d\n', second_data);
fclose(fid);
>> first data: 8
>> second data: 1
现在,这是我在 Python 中编写数据的方式:
fid=open('hello_python.test','wb')
first_data=4+4
second_data=1
fid.write(struct.pack('>i',first_data))
fid.write(struct.pack('>i',second_data))
fid.close()
这就是我在 python 中读回这些数据的方式。另请注意,注释掉的部分有效(从用 Python 编写的文件中读取时)。我最初认为struct.calcsize('>i') 的计算方式发生了一些奇怪的事情,所以我删除了它,而是放入了一个硬编码常量INTEGER_SIZE,来表示我知道 MATLAB 在编码时使用的字节数:
INTEGER_SIZE=4
fid=open('hello_python.test','rb')
### FIRST WAY I ORIGINALLY READ THE DATA ###
# This works, but I figured I would try hard coding the size
# so the uncommented version is what I am currently using.
#
# first_data=struct.unpack('>i',fid.read(struct.calcsize('>i')))[0]
# second_data=struct.unpack('>i',fid.read(struct.calcsize('>i')))[0]
### HOW I READ DATA CURRENTLY ###
first_data=struct.unpack('>i',fid.read(INTEGER_SIZE))[0]
second_data=struct.unpack('>i',fid.read(INTEGER_SIZE))[0]
print "first data: '%d'" % first_data
print "second data: '%d'" % second_data
fid.close()
>> first data: 8
>> second data: 1
现在,假设我想在 MATLAB 中阅读 hello_python.test。使用我当前的 MATLAB 代码,这是新的输出:
>> first data: 419430400
>> second data: 16777216
这很奇怪,所以我做了相反的事情。我查看了阅读hello_matlab.test 时会发生什么。使用我当前的 Python 代码,这是新的输出:
>> first data: 419430400
>> second data: 16777216
所以,发生了一些奇怪的事情,但我不知道它是什么。另请注意,虽然这是一个更大项目的一部分,但我只是将我的代码的这些部分提取到一个新项目中,并用这些结果测试了上面的示例。我真的很困惑如何使这个文件可移植:(任何帮助将不胜感激。
【问题讨论】:
-
我在 MATLAB 代码中看不到任何表明您正在以大端格式编写值的内容;我怀疑它们是用 little-endian 格式编写的,所以在使用 Python 代码阅读时,你需要
<i而不是<I。 -
另外,在编写了整个 MATLAB 文件之后,用 Python 打开该文件并执行简单的
fid.read()读取全部内容的结果是什么?
标签: python matlab file struct binary