读完这篇文章:http ://commandcenter.blogspot.fi/2012/04/byte-order-fallacy.html
文章中的方法是这样的:
从大端读取:
int i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
Run Code Online (Sandbox Code Playgroud)
从小端读取:
int i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
Run Code Online (Sandbox Code Playgroud)
有什么方法可以将这种思想转换为浮点数吗?
那么有什么办法可以避免if(swap_needed) swap(data);
我的一个想法是从数据中单独读取符号位、尾数和指数,并根据它们计算浮点值。
如果您继续使用简单的非英特尔 IEEE-754 浮点或双精度,Sebastian Redl 的答案是正确的,但如果使用英特尔双精度和长双精度的特殊表示,以及其长双精度格式的所有其他特殊想法,它将失败。只有极少数架构使用标准 IEEE-754 浮点格式。即使是最简单的mips,可以随意使用BE/LE,也有特殊的MIPS64 16字节长双精度格式。
因此,没有正确且简单的方法来对浮点数进行快速字节交换。然而,我编写了代码来将各种架构中的浮点数读取到当前架构中,这是一项艰巨的任务。https://github.com/parrot/parrot/blob/native_pbc2/src/packfile/pf_items.c#L553 注意:intel 的特色是 https 中用 i 标记的额外归一化位(尾数的最高位 63): //github.com/parrot/parrot/blob/native_pbc2/src/packfile/pf_items.c#L605
即我在 BE 和 LE 之间进行转换:
还没有:
由于没有太大的需要,我从未为这个浮点转换代码创建一个合适的库。顺便提一句。我使用更快的本机 byteswap 函数,请参阅https://github.com/parrot/parrot/blob/native_pbc2/include/parrot/bswap.h
通常你打印最大。精度为字符串并读取该字符串。在那里你唯一的问题是找出你的最大值。精确。