在使用Win10 x64的笔记本电脑上,我使用了一种软件,可以将直方图数据保存到文件中,并使用' .dat'扩展,我试图在Win7 x64上打开它。
在软件文档中,该文件具有以下格式:
现在,如果我用十六进制编辑器打开文件,我可以看到这些值对应于上面的编号点:
'11 EA 2D 81 99 97 71 3D'
'49 AF BC 9A F2 D7 7A 3E'
'01 00 00 00'
'00 00 00 00'
'F4 01 00 00'
'90 01 00 00'
从我所看到的,查看3的值,并知道应该是1或0我可以看到它应该实际读取'00 00 00 01'
。在线阅读一些信息,我认为这是“小端”#。
在我的Win7笔记本电脑上[cinfo, maxsize, ordering] = computer
在Matlab中编写以下内容,我得到答案'L'
。 Matlab中的字符编码是' windows-1252'。
使用各种工具在线测试结果值我得到以下结果:
3D719799812DEA11
代替11EA2D819997713D
)我得到了结果
1.000e-12
。3D719799812DEA11
的值代替
11EA2D819997713D
),我得到1.0001e-7的结果。这意味着上述编号点的值为:
所以,如果我尝试在Matlab中打开文件,我知道我应该找到什么。 这就是我到目前为止所做的:
name = 'histogram.dat';
fid = fopen(name,'r');
v = fread(fid);
这为v
提供了800032x1倍。如果我打开v
向量,我会看到以下内容:
接下来,我删除了所有内容,然后尝试按以下方式读取二进制文件:
name = 'histogram.dat';
fid = fopen(name,'r');
c1 = fread(fid,8,'float64');
c2 = fread(fid,8,'float64');
c3 = fread(fid,4,'uint32');
c4 = fread(fid,4,'uint32');
c5 = fread(fid,4,'uint32');
c6 = fread(fid,4,'uint32');
现在我得到了完全不同的东西。
c1 = [1.00e-12; 1.00e-07; 4.90e-324; 8.48e-312; -1.06e-314; -1.06e-314; -1.06e-314; -1.06e-314 ];
c2 = [-1.06e-314; -1.06e-314; -1.06e-314; -1.06e-314; -1.06e-314; -1.06e-314; -1.06e-314; -1.06e-314];
c3 to c6 = [2.1475e09; 2.1475e09; 2.1475e09; 2.1475e09];
因此,似乎没有按预期工作。如何在Matlab中打开文件,并且具有与我预期相同的值?而且,如何从31到最后打开字节?我想我一直读到每个4字节,然后得到值?
另外,如果我得到每个向量的HEX值,我做hex2num
(对于前2个,float64s)或hex2dec
(对于下一个向量,uint32s),我得到了正确的结果。我还应该先hex2num
或hex2dec
二进制数字吗?
另一种可能性是在普通的十六进制编辑器中打开文件,获取在Matlab中导入的大矢量,将字节顺序与swapbyes
交换,然后执行hex2num/dec
。然后我会得到正确的值。
答案 0 :(得分:1)
fread
的第二个参数是要读取的元素数,而不是字节数。它将根据您指定的数据类型调整字节数。例如,要将单个float64读入c1
,您实际需要
c1 = fread(fid,1,'float64');
您需要相应地调整其他值。要将其余数据读入文件末尾,请将第二个参数替换为Inf
。
无需转换为十六进制值或从十六进制值转换;十六进制值只是关于值如何在屏幕上显示。
答案 1 :(得分:0)
此外,您可以使用
读取字节向量中的整个数据bytevec = fread(fid,inf,'uint8');
然后,您可以通过索引手动排列bytevec
的元素(或使用reshape
)并调用
value = cast(bytevec(i1:i2), type);
然后将其转换为默认的matlab double类型而不更改数据:
double_value = typecast(value,'double');