[现在是否有必要考虑“ BigEnd或LittleEnd”问题? [处于保留状态]

问题描述 投票:-1回答:2

我们都被告知计算机系统中存在高端和低端。但是,几乎我的应用程序都在x86和arm架构下运行,它们都是低端设计的系统。这样,是否有必要一直考虑这个问题?这让我很困惑何时考虑字节顺序。任何提示或熟练的建议都值得赞赏〜

c++ endianness
2个回答
4
投票

如果发现使用有关体系结构字节序的任何信息,则说明您是在编写编译器/标准库,或者是在做错什么。

二进制数据格式确实具有字节序,应用程序需要考虑这些字节序。许多现有的数据格式使用大尾数表示。

因此,一般而言,应用程序仅处理字节间边界处的字节序。理想情况下,它封装在平台API中,例如htonlntohl,但有时这些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


2
投票

是;网络字节顺序与x86不符。

作为一般规则,从不读取字节到串行化中或从中读取字节。始终以结构或数学方式重新打包和排列字节。这很烦人,但解决了字节序和其他许多问题。

[好的编译器,如果您实际上像memcpy一样编写它们,并且编译器可以证明这一点,则会进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.