在 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.
我正在尝试读取 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.