matlab — двоичный файл для чтения C ++ с помощью «ieee-be» machinefmt

Я в основном пытаюсь конвертировать Matlab Code в C ++, читая двоичный файл, я не знаю, как он выглядит.

Код Matlab упрощен следующим образом:

x=zeros(48,32);
fid=fopen('pres_00.bin','r','ieee-be');
fseek(fid,ipos,'bof');
x(1:4:48,:)=fread(fid,[12,32],'single');

в конце мы получаем двойные числа в массиве x (строка 1, 5, ..)

Как я могу прочитать файл * .bin в C ++? Я старался:

file1.seekg(0, ios::end);
int length = file1.tellg();
file1.seekg(ipos, ios_base::beg);
lenght = lenght - ipos;

char * buffer = new char[length];

file1.read(buffer, length);
double* double_values = (double*)buffer;
double test = double_values[0];
file1.close();

К сожалению, «test» не похож на число, которое matlab кодирует из двоичного файла. Как я могу реализовать информацию с кодировкой ieee-be в c ++?
К сожалению, я не знаком с двоичными файлами …

Приветствия и спасибо за вашу помощь!

//редактировать:

Может быть, это поможет:
В моем случае

ipos = 0
the first hex row (offset0) (32) :
44 7C CD 35 44 7C AD 89 44 7C E9 F2 44 7D F7 10 44 7D 9C F9 44 7B F9 E4 44 7B 3E 1D 44 7B 6C CE

ANSI: D|Í5D|.‰D|éòD}÷.D}œùD{ùäD{>.D{lÎ

First value in Matlab: 1.011206359863281e+03

What my Code reads in buffer: D|Í5D|-‰.D|éòD}÷.\x10D}œùD{ùäD{>\x1dD{lÎ......
double test = -4.6818882332480884e-262

0

Решение

Есть две части этой проблемы. Во-первых, это представление 32-битной плавающей запятой IEEE; Поскольку большинство процессоров используют IEEE с плавающей запятой, все, что вам нужно, — это просто приведение к преобразованию. Это не будет переносимым все процессоры все же. Вторая часть be в ieee-be спецификация, это означает, что байты хранятся большой обратный порядок байт. Поскольку многие процессоры (то есть Intel / AMD) имеют младший порядок, перед преобразованием необходимо выполнить замену байтов.

void byteswap4(char *p)
{
std::swap(p[0], p[3]);
std::swap(p[1], p[2]);
}

float to_float(char *p)
{
return *((float*)p);
}

Посмотрите это в действии: https://ideone.com/IrDEJF

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]