我在 Labview 中有大量以二进制形式保存的文件,其中每一列都是一个时间戳簇,后跟一个单曲向量。
我使用将每个数据文件读入 Matlab r2013a
fid = fopen(filename);
data = fread(fid,[N M],'*single',0,'b');
fclose(fid);
我预先计算了输入数组 N,M 的大小。因为我知道数据应该是什么样子,所以我发现这data(1:5,:)
是隐藏时间戳数据的地方,但它看起来像这样M = 1
:
[0 -842938.0625 -1.19209289550781e-07 0 4.48415508583941e-42]
第一个元素始终为 0,第二个元素以恒定的步长单调递减,第三个元素似乎是双稳态的,在两个非常小的值之间来回翻转,第四个元素始终为 0,第五个也是恒定的。
我假设它与 Labview 如何编码日期有关,但我的 google-fu 并没有帮助我解决这个问题。
为了使这个问题更笼统,那么:
Labview 在保存到二进制文件时如何对时间戳簇进行编码,我如何将其读出并将其翻译成另一种编程语言(例如 Matlab)中的有意义的数字?
编辑: 对于后代,这是我的最终代码(附加到上面的代码):
datedata = data(5:-1:1,:);
data(1:5,:) = [];
dms = typecast(reshape(datedata(2:3,:),[],1),'uint64');
dsecs = typecast(reshape(datedata(4:5,:),[],1), 'int64');
timestamp = datenum(1904,1,1) + (double(dsecs) + double(dms)*2^-64)/(3600*24);
在 Mathworks 发布的代码@Floris 中,他们直接将类型转换为 double,但是当我尝试这样做时,我得到了垃圾。为了获得正确的日期,我必须先转换为整数,然后再转换为两倍。由于我的瓶颈是fread
在线(从外部磁盘读取 0.3 秒),额外的类型转换步骤在宏伟的计划中是微不足道的。
额外的列 4.5e-42 转换为整数值 3200,即后续单曲向量中的值的数量。