Как записать двоичные данные в Python и прочитать их в C? - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь записать массив целых чисел в двоичный файл, используя 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 голосов
/ 12 октября 2018

Здесь я бы с осторожностью отнесся к проблемам с порядком байтов.

Рассмотрите возможность использования модуля Array: https://docs.python.org/3/library/array.html

Вы указываете формат данных, но передаете нативные типы Python.Затем он обрабатывает преобразование для вас.Это более простой способ обработки перевода, чем использование модуля struct.

ex

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.Это необходимо, если вы не соответствуете порядку байтов архитектуры процессора.

0 голосов
/ 12 октября 2018

Использование функции 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;
}

лучше.

...