C++ 使用 "ieee-be" machinefmt 读取二进制文件
C++ Read Binary File with "ieee-be" machinefmt
我基本上尝试将 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
这个问题有两个部分。首先,表示是IEEE 32位浮点数;由于大多数处理器使用 IEEE 浮点数,因此您只需要一个简单的强制转换即可进行转换。不过,这不能移植到 all 处理器。第二部分是ieee-be
规范中的be
,意思是存储字节big-endian。由于许多处理器(即 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
我基本上尝试将 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
这个问题有两个部分。首先,表示是IEEE 32位浮点数;由于大多数处理器使用 IEEE 浮点数,因此您只需要一个简单的强制转换即可进行转换。不过,这不能移植到 all 处理器。第二部分是ieee-be
规范中的be
,意思是存储字节big-endian。由于许多处理器(即 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