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

Different outputs when reading binary file in Matlab and Julia

我正在尝试读取 Julia 中的二进制文件。该文件包含有关 3D 位置的信息 space。 我的代码基于 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');

产生 vnum = -2051210752。 我没有 运行 你提供的 Julia 代码,但显然它调用 read() 没有任何字节序转换(见 https://docs.julialang.org/en/v1/base/io-network/#Base.read),所以我希望它是 return -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

一些在线计算器like this one可以显示以不同顺序读取这个 4 字节序列的结果。)

跟进Vicky的回答,正确的做法是:

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

文档here.