我正在用Python编写一个二进制文件,并用C读取它

import struct

with open('test.bin', 'wb') as outfile:
    outfile.write(struct.pack('didi', 1.2, 1, 1.3, 2))

当我用C读文件时,我得到了混乱的数据:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main(int argc, char *argv[]) {
    double testdouble, testdoubletwo;
    int testint, testinttwo;

    FILE *f = fopen("test.bin", "rb");
    assert(f);

    assert(fread(&testdouble, sizeof(testdouble), 1, f));
    assert(fread(&testint, sizeof(testint), 1, f));
    assert(fread(&testdoubletwo, sizeof(testdoubletwo), 1, f));
    assert(fread(&testinttwo, sizeof(testinttwo), 1, f));

    fprintf(stderr, "testdouble: %f, testint: %d, testdouble: %f, testinttwo: %d", testdouble, testint, testdoubletwo, testinttwo);

    return 0;
}

输出:
testdouble: 1.200000, testint: 1, testdouble: -92559641157289301412905710012271939667257667601819249288413184.000000, testinttwo: 1073007820

如果我去掉整数,这个小例子就行了,但对于我读几十个双倍的实际问题就不行了。他们中的一些人(不是第一个,不是最后一个)最后乱七八糟。
系统:Ubuntu12.0464位
巨蟒:2.7.3

最佳答案

在你的C代码中,你逐条读出每一项,这意味着你没有应用任何对齐。试试这个:

outfile.write(struct.pack('=didi', 1.2, 1, 1.3, 2))

hexdump测试.bin
0000000 3333 3333 3333 3ff3 0001 0000 cccd cccc
0000010 cccc 3ff4 0002 0000

C代码输出:
testdouble: 1.200000, testint: 1, testdouble: 1.300000, testinttwo: 2

如果不更改python代码,仍然使用“didi”,则更改c代码如下:
struct D {
    double td;
    int ti;
    double td2;
   int ti2;
};


struct D d;
fread(&d, sizeof(struct D), 1, f);
fprintf(stderr, "testdouble: %f, testint: %d, testdouble: %f, testinttwo: %d", d.td, d.ti, d.td2, d.ti2);

这个在Fedora17上的测试,使用Python2.7.3,GCC4.7.2,我更喜欢定义结构。

10-08 04:15