如何在Python中编写二进制数据并在C中读取它?

时间:2018-10-12 14:13:52

标签: c python-3.x io

我正在尝试使用Python将整数数组写入二进制文件并在C中读取这些值。我尝试了以下代码,但结果是垃圾。

Python:

import struct
import numpy as np
import matplotlib.pyplot as plt
from functools import reduce

# s = np.random.uniform(0,500,1000)

mu, sigma = 1, 0.1 # mean and standard deviation
n = np.random.normal(mu, sigma, 5000)
n = [i * 1000 for i in n]
n = [int(round(i, 0)) for i in n]
n.sort()

with open('norm.bin', 'wb') as f:
    for e in n:
        f.write(struct.pack('i', e)) 

C:

#include <stdio.h>

#define SIZE 5000

int main()
{
    FILE *file;
    int norm[SIZE];

    file = fopen("norm.bin","rb");  
    fread(norm, sizeof(int), 1, file); 
    fclose(file);

    for (int i = 0; i < SIZE; i++) {
        printf("%d\n", norm[i]);
    }

    return 0;
}

如果有人能帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

fread()函数的用法是

fread(/*buffer*/, /*size of one element*/, /*number of elements*/, /*file pointer*/);

因此

fread(norm, sizeof(int), 1, file);

仅读取一个元素,而其余4999个元素未初始化。

使用

fread(norm, sizeof(int), SIZE, file);

读取SIZE元素。

fread()返回读取的元素数,因此检查读取是否成功

if (fread(norm, sizeof(int), SIZE, file) != SIZE) {
    fputs("fread() failed\n", stderr);
    fclose(file);
    return 1;
}

更好。

答案 1 :(得分:0)

我会在这里对字节序问题保持警惕。

考虑使用Array模块: https://docs.python.org/3/library/array.html

您指定数据格式,但传入本机python类型。然后,它会为您处理转换。与使用struct模块相比,这是处理翻译的一种简便方法。

e.x。

In [18]: a=array('h', [1, 2, 3, 4, 5])

In [19]: a.tostring()
Out[19]: '\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00'

In [20]: a.byteswap()

In [21]: a.tostring()
Out[21]: '\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05'

您还可以使用a.tofile()将bin数据写入文件。注意使用byteswap。如果您的CPU架构字节序不匹配,这是必要的。