python中的替代读取二进制而不是C ++

时间:2016-10-06 13:05:20

标签: python c++

我有一个二进制文件和C ++代码,可以读取如下的二进制文件。

int NumberOfWord;
FILE *f = fopen("../data/vec.bin", "rb");
fscanf(f, "%d", &NumberOfWord);
cout << NumberOfWord< <endl;

此输出为:

114042

我想在python中重新实现上面的代码。

with open("../data/vec.bin","rb") as f:
    b = f.read(8)
    print struct.unpack("d",b)[0]

但此代码无效。 我的输出是:

8.45476330511e-53

我的问题是:

1)为什么整数在C ++中有8个字节。

我从不知道%d意味着双倍。 但实际上变量的类型是整数,但通常我们使用&#34;%d&#34;在C ++中。 这很奇怪。

2)如何在python中提取实数

我想在python代码中提取像C ++代码一样的实数。 我怎么做?

也许,我在python中误解了struct模块。

2 个答案:

答案 0 :(得分:1)

由于您已经能够使用此C ++(或更确切地说是C)行fscanf(f, "%d", &NumberOfWord);正确读取文件,我假设您的文件包含114042的文本表示。因此它包含字节

0x31 0x31 0x34 0x30 0x34 0x32 ...'1', '1', '4', '0', '4', '2', ...

在文本编辑器中打开它时,您可以看到一行114042

现在,当您尝试读取是否为i格式的二进制文件时,您使用文件的4个第一个字节并实际获得int('31313034', 16):825308208。我无法重现您使用{{{ 1}}格式将其解码为double,因为我无法猜到最后一位数字后文件中出现了什么......

如果数字在第一行是单独的,那很简单:只需读取一行并将其转换为int:

d

如果最后一个数字后面还有其他字符,则必须首先使用正则表达式(不要忘记导入with open("../data/vec.bin","rb") as f: print int(f.readline()) )来获取数值,然后将其转换为int:

re

TL / DR:不要尝试读取文本文件,就像它包含二进制表示

一样

答案 1 :(得分:0)

在C格式字符串中,%d是十进制的缩写。

在Python中,d是double的缩写。

如果是整数,则应在i调用中使用struct.unpack

with open("../data/vec.bin","rb") as f:
    b = f.read()
    print struct.unpack("i",b)[0]