matlab C++用“IEEE-BE”机器读取二进制文件

yftpprvb  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(251)

我基本上是试着把MatLab代码转换成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、.)
如何在C++中读取*.bin文件?我试过:

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
vs3odd8k

vs3odd8k1#

这个问题有两个部分。首先,表示是IEEE 32位浮点;因为大多数处理器使用IEEE浮点,所以您只需进行简单的强制转换即可完成转换。不过,它不能移植到所有处理器上。第二部分是ieee-be规范中的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

相关问题