我有旧的二进制文件写在什么被称为'DEC'格式。为了从这种格式中获得4字节浮点数的正确值,我可以执行以下操作:
1.读取字节
1.交换最后两个字节和前两个字节(交换字1和字2)
1.使用readBin()将字节转换为数字
1.将该值除以4
我以为readBin()中会有一个endian选项[c('little','big','swap')]来处理这个问题,但事实似乎并非如此。下面是一个示例和一些代码,显示了当前的解决方法。
# Start with actual value from sample file:
# 4 bytes representing target value of 1.290
# in practice dec_bytes is read in by readBin(con, raw(), n=4)
dec_bytes <- writeBin(1.290, raw(), size=4)
# Now rearrange bytes swapping words
pc_bytes <- c(dec_bytes[3], dec_bytes[4], dec_bytes[1], dec_bytes[2])
# Now use readBin to give numeric value of bytes
pc_float <- readBin(pc_bytes, numeric(), n=1, size=4)
pc_float
# [1] 0.5161456
# Now divide by 4 to get the correct answer
pc_float <- pc_float / 4
pc_float
#[1] 0.1290364
我显然可以创建一个函数来做到这一点,如上所述,但实际的问题是:有没有更简单有效的方法来做到这一点?在我大约30年前编写或发现的一些C代码中,我使用了以下函数,我只能假设它实际上是有效的:
float ConvertDecToFloat(char bytes[4])
{
char p[4];
p[0] = bytes[2];
p[1] = bytes[3];
p[2] = bytes[0];
p[3] = bytes[1];
if (p[0] || p[1] || p[2] || p[3])
--p[3]; // adjust exponent
return *(float*)p;
}
因此--p[3]在重新排列后从最后一个字节中减去1,从而得到正确的答案,而不必除以4。不确定这是否可以在R中完成,而无需转换为整数并返回到字节。
1条答案
按热度按时间k4emjkb11#
由同事回答(感谢Michael Schwartz)。简单的向量化解决方案是创建用于重组字节向量值的索引的向量。我有两个可行的解决方案:
我用microbench测试了一下,这两个之间的处理时间没有明显的区别。注意,对于原始DEC数据,pc_float需要除以4以获得正确答案,除非进行字节调整。