二进制文件解析 matlab,从Python和vers解析MATLAB编写的二进制文件

我在使用python中的struct.unpack时遇到了很大的问题。我有一个预先确定格式的二进制文件,可以用MATLAB或Python编写。在

我可以用Python将二进制数据写入一个文件,然后毫无问题地读回数据。我也可以将同样的数据从MATLAB写入二进制文件,然后在MATLAB中读取。在

当我从MATLAB中编写数据并尝试用Python读回数据时,或者当我用Python编写数据并尝试在MATLAB中读回时,我的问题就出现了。在

为了简单起见,假设我正在将两个整数写入一个二进制文件(big-endian)。每个整数是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中读到的:

^{pr2}$

现在,我是如何用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

所以,有些奇怪的事情发生了,但我不知道是什么。另外请注意,虽然这是一个更大项目的一部分,但我只是将代码的这些部分提取到一个新项目中,并用这些结果测试了上面的示例。我真的很困惑如何使这个文件可移植:(任何帮助将不胜感激。在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值