我有8个字节代表一个数字。我给出的描述是:
“有符号的Little-Endian编码的八字节整数字段有八个 隐含的小数位“
当“搜索”来自文件转储的数据时,八个字节是(我已经包含了char表示只是为了使二进制清除):
在查看了endian-ness维基百科文章后,我想我需要从[7]开始并向后工作到[0](文件顺序是从[0]到[7])。但我不确定我需要对这些值做些什么。
有人可以帮我解决这个数字是什么(这样我可以将这8个字节分配给一个双倍)?
答案 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。