字节顺序谬误代码是如何工作的?
How does the Byte Order Fallacy code work?
也在this article, titled The byte order fallacy, the author states that worrying about the endianness of the system your code runs on is unnecessary. The article has been mentioned in a few places on Whosebug。在文章中,作者假设只要知道数据流的字节顺序,就可以使用以下代码片段自动处理它:
小端流:
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
大端流:
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
由于作者没有对此进行任何解释,我有两个问题:第一,这实际上是如何工作的?第二:如果不检查系统的字节顺序(如果一开始就可能的话),如何扭转这一局面?
这些片段有效,因为移位运算符对数字进行操作,就好像它是大端,而不考虑字节顺序。这意味着,在大端和小端机器上将 0x1234
向右移动 4 位将导致表示 0x0123
.
的数字
这也适用于左侧,即 0x1234 << 4 == 0x12340
,在整数大小的限制内。
相反,即写入具有给定字节序的流,可以通过使用右移而不是左移来分解整数来完成:
char buf[4] = {x, x >> 8, x >> 16, x >> 24}; // Little-endian
char fub[4] = {x >> 24, x >> 16, x >> 8, x}; // Big-endian
也在this article, titled The byte order fallacy, the author states that worrying about the endianness of the system your code runs on is unnecessary. The article has been mentioned in a few places on Whosebug。在文章中,作者假设只要知道数据流的字节顺序,就可以使用以下代码片段自动处理它:
小端流:
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
大端流:
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
由于作者没有对此进行任何解释,我有两个问题:第一,这实际上是如何工作的?第二:如果不检查系统的字节顺序(如果一开始就可能的话),如何扭转这一局面?
这些片段有效,因为移位运算符对数字进行操作,就好像它是大端,而不考虑字节顺序。这意味着,在大端和小端机器上将 0x1234
向右移动 4 位将导致表示 0x0123
.
这也适用于左侧,即 0x1234 << 4 == 0x12340
,在整数大小的限制内。
相反,即写入具有给定字节序的流,可以通过使用右移而不是左移来分解整数来完成:
char buf[4] = {x, x >> 8, x >> 16, x >> 24}; // Little-endian
char fub[4] = {x >> 24, x >> 16, x >> 8, x}; // Big-endian