将8字节值转换为实际数字:

时间:2013-11-23 15:53:14

标签: c binary double computer-science endianness

我有8个字节代表一个数字。我给出的描述是:

  

“有符号的Little-Endian编码的八字节整数字段有八个   隐含的小数位“

当“搜索”来自文件转储的数据时,八个字节是(我已经包含了char表示只是为了使二进制清除):

  • [0] = 0('\ 0')
  • [1] = 86('v')
  • [2] = 41(')')
  • [3] = 50('2')
  • [4] = 48('0')
  • [5] = 0('\ 0')
  • [6] = 0('\ 0')
  • [7] = 0('\ 0')

在查看了endian-ness维基百科文章后,我想我需要从[7]开始并向后工作到[0](文件顺序是从[0]到[7])。但我不确定我需要对这些值做些什么。

有人可以帮我解决这个数字是什么(这样我可以将这8个字节分配给一个双倍)?

1 个答案:

答案 0 :(得分:3)

你的假设错了LE意味着第一个字节是具有最低重要性的字节。

要便于转换,可以使用

uintmax_t read_le_value(char * data, size_t len)
{
    uintmax_t value = 0;
    size_t i;
    for (i=0; i<len; i++) {
        value |= data[i] << (8*i);
    }
    return value;
}

您可以使用

调用此功能
int64_t result = read_le_value(array, sizeof array);

请注意,这会调用实现定义的行为:对于不使用二进制补码存储有符号值的体系结构,它可能会中断。

如果没有其他要点,这个64位值就可以了:

  

有八个隐含的小数位

可能是指它可能是一个定点表示法,而1200000000的值确实意味着12.00000000

所以你应该将结果除以1E8(= 100000000)以获得想要的结果。

但请注意,转换为double会失去精度,因为double只有53位精度。

因此,表示为100000000000000001的值1000000000.00000001将转换为1000000000.0:如果您减去此数字,您将获得0.0,而不是.00000001。