我们都被告知计算机系统中存在高端和低端。但是,几乎我的应用程序都在x86和arm架构下运行,它们都是低端设计的系统。这样,是否有必要一直考虑这个问题?这让我很困惑何时考虑字节顺序。任何提示或熟练的建议都值得赞赏〜
如果发现使用有关体系结构字节序的任何信息,则说明您是在编写编译器/标准库,或者是在做错什么。
二进制数据格式确实具有字节序,应用程序需要考虑这些字节序。许多现有的数据格式使用大尾数表示。
因此,一般而言,应用程序仅处理字节间边界处的字节序。理想情况下,它封装在平台API中,例如htonl
和ntohl
,但有时这些API不可用/不合适,并且实现需要提供自己的API。它仍然可以完全忽略平台字节序。例如代替
uint32_t var;
file.read(&var, sizeof(var));
#if LITTLE_ENDIAN
swap_byte_order(var);
#endif
一个可以写
uint32_t var; byte buf[4];
file.read(buf, sizeof(buf));
var = buf[3] | buf[2]<<8 | buf[1]<<16 | buf[0]<<24;
现代编译器将最后一行编译为x86上的单个bswap
指令。无论架构的字节顺序如何,它都可以工作,因此无需预处理器疯狂,也无需进行配置麻烦。
有关更多信息,请阅读The byte order fallacy。
是;网络字节顺序与x86不符。
作为一般规则,从不读取字节到串行化中或从中读取字节。始终以结构或数学方式重新打包和排列字节。这很烦人,但解决了字节序和其他许多问题。
[好的编译器,如果您实际上像memcpy一样编写它们,并且编译器可以证明这一点,则会进行优化。