Кодирование данных в C и Python - PullRequest
       8

Кодирование данных в C и Python

0 голосов
/ 03 сентября 2018

Я сталкиваюсь со следующим вопросом. Я записал некоторые данные двойного типа в двоичные файлы, используя C, и теперь я хочу прочитать их, используя Python. Когда я использовал функцию Python

with open("test.dat","rb") as dfile:
    data = dfile.read()

Это дало мне

Ь '\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ XF8? \ X00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x04 @ \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ п @ \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x11 @

Итак, я попытался декодировать, используя data.decode(), тогда это дало мне ошибку декодирования. Я полагаю, это потому, что я использовал неправильный тип кодировки. Но я пробовал ascii и utf-8, и они не работали. Поэтому у меня два вопроса:

  1. Как я могу прочитать двоичный файл, не зная тип кодировки?

  2. Поскольку я не указал тип кодирования при записи двоичного файла в c, кодирует ли c данные вообще? Если да, то какой это будет тип кодировки?

К вашему сведению, код, который я использовал для записи двоичного файла, в первую очередь -

#include <stdio.h>

int main(){
  double buffer[4]= {1.5, 2.5, 3.25, 4.25};
  FILE *ptr;

  ptr = fopen("test.dat", "wb");
  fwrite(buffer,sizeof(buffer),1,ptr);
  printf("%ld\n",sizeof(buffer));

  return 0;
}

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Вы можете использовать стандарт Python массив модуль:

from array import array

u = array('d')

with open('test.dat', 'rb') as f:
    data = f.read()
    u.frombytes(data)
    print(u)
    print(u.tolist())

Выход:

array('d', [1.5, 2.5, 3.25, 4.25])
[1.5, 2.5, 3.25, 4.25]
0 голосов
/ 03 сентября 2018

Если вы открыты для использования numpy, используйте np.fromfile:

with open("test.dat","rb") as dfile:
    data = np.fromfile(dfile)

Вам может показаться, что с массивными массивами проще манипулировать, чем с простыми типами Python из-за огромной экосистемы кода, которая выросла вокруг них.

0 голосов
/ 03 сентября 2018

Вам необходимо преобразовать типы C в типы Python. Используйте struct.unpack в стандартной библиотеке здесь .

Строка формата, в данном случае, dddd, что означает 4 двойных. Трудность возникает при перемещении типов C между различными компиляторами и машинами.

import struct

with open('test.dat', 'rb') as dfile:
    data = dfile.read()

result = struct.unpack("dddd", data)
print(result)

Дает кортеж:

(1.5, 2.5, 3.25, 4.25)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...