用python代替c++读取二进制文件

alternative reading binary in python instead of C++

本文关键字:读取 二进制文件 c++ 代替 python      更新时间:2023-10-16

我有一个二进制文件和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是double。但是,实际上变量的类型是整数,但通常我们在c++中使用"%d"输出。真奇怪。

2)如何在python中提取实数

我想提取一个实数像上面的c++代码在python代码。我怎么知道??

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

由于您已经能够使用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。我无法复制你用d格式解码的结果,因为我猜不出你的文件中最后一位数字之后是什么…

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

with open("../data/vec.bin","rb") as f:
    print int(f.readline())

如果最后一位数字后有其他字符,则必须首先使用regex(不要忘记导入re)来获取数值,然后将其转换为int:

with open("../data/vec.bin","rb") as f:
    line = f.readline()
    m = re.match(t's*d*', line)
    print(int(m.group(0)))

TL/DR:不要试图读取包含二进制表示的文本文件

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

在Python中,d是double的缩写。

如果它是一个整数,你应该在struct.unpack调用中使用i

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