我正在尝试读取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)
此处提供文档。