在Matlab和Julia中读取二进制文件时输出不同



我正在尝试读取Julia中的一个二进制文件。该文件包含有关三维空间中位置的信息。我的代码是基于matlab脚本的,但当试图重现读取时,Julia给了我一个不同的结果。我已经通读了Julia的文档,但我不明白这种差异是从哪里来的。

这是matlab代码:

file = 'lh.white';
fid = fopen(file, 'rb', 'b');
b1 = fread(fid, 1, 'uchar');
b2 = fread(fid, 1, 'uchar');
b3 = fread(fid, 1, 'uchar');   
fgets(fid);
fgets(fid);
vnum = fread(fid, 1, 'int32');

和Julia类似物:

file = "lh.white"
fid = open(file)
signature = read(fid, 3)  # equivalent of 3 'uchar' from matlab
readline(fid, keep=true) # ok
readline(fid, keep=true) # ok
vnum =read(fid, Int32)  # different results.

有人知道这里会发生什么吗?为什么Julia中的vnum是一个与matlab输出不同的大负数?

我在这里上传了一个虚拟数据集,如果它有用的话:https://filebin.net/k8sv7d8ztmucqell

问题很可能与正在处理的数据的字节序有关。在MATLAB中,以大端字节顺序(docs(打开fread()ing的文件,即

fid = fopen(file, 'rb', 'b');
%fread()s, fgets()es
vnum = fread(fid, 1, 'int32');

生成vnum = 179589,而使用本地机器格式(小端序模式,32位字(,

fid = fopen(file, 'rb');
%fread()s, fgets()es
vnum = fread(fid, 1, 'int32');

产生CCD_ 4。我还没有运行您提供的Julia代码,但很明显,它调用read()时没有进行任何endianness转换(请参阅https://docs.julialang.org/en/v1/base/io-network/#Base.read),所以我希望它也能返回-2051210752

(我们试图在这里读取的整数是0x0002bd85;请参阅您提供的lh.white的六进制转储:

$ xxd lh.white
00000000: ffff fe63 7265 6174 6564 2062 7920 7465  ...created by te
00000010: 7374 0a0a 0002 bd85 0005 7b06 c189 b752  st........{....R

一些像这样的在线计算器可以以不同的顺序显示读取这个4字节序列的结果。(

根据Vicky的回答,正确的方法是:

vnum = ntoh(read(fid, Int32))
# instead of
vnum =read(fid, Int32)

此处提供文档。

相关内容

  • 没有找到相关文章