大端和小端混淆
Big endian and small endian confusion
我看到了两个大 endian/small 字节序的定义,这让我很困惑。
第一个定义是机器相关的经典定义:
大端系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(另请参阅最高有效位)。相反,小端系统将最低有效字节存储在最小地址中。
这是完全有道理的,这是我一生中 big/small 字节序的定义,直到我遇到与密码学相关的各种讨论:
书 "Cryptography for Developers" 作者:Tom St Denis 说,"the OS2IP function converts the octet string to integer by loading the octet strings in big endian fashion. That is, the first byte is the most significant."
https://crypto.stackexchange.com/questions/10824/what-does-an-rsa-signature-look-like/10826#10826
在这个问题的公认答案中,它说,"The padded value is then interpreted as an integer x, by decoding it with the big-endian convention."
显然,这两个加密讨论不涉及任何与机器架构相关的内容。他们对大端 fashion/convention 的定义是什么?
大端和小端只是用字节表示数字的约定。在 big endian 中,最重要的字节在前,在 little endian 中则相反。不同的架构、数据格式、算法和网络协议可能采用不同的策略。
此外,好的程序不会依赖于体系结构的字节顺序,例如,要从数组中读取一个数字,您可以这样写:
int read_bit_endian_16(unsigned char *data) {
return (data[0] << 8) + data[1];
}
或使用像 ntohs()
和朋友这样的功能。
在 Python 中是:
struct.unpack('>h', data)
如果您希望二进制数据格式是跨平台的,那么二进制数据格式就是字节顺序很重要的一个很好的例子。如果您在低端平台上写入数据,您希望能够在大端平台上读取它。这就是为什么任何体面的格式都会明确指定这些东西,并且可移植程序会考虑在不同体系结构中成为 compiled/run 的可能性。其他示例是多字节字符编码,如 UTF16-LE 和 UTF16-BE。
你可以找到更详细的解释here
我看到了两个大 endian/small 字节序的定义,这让我很困惑。
第一个定义是机器相关的经典定义:
大端系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(另请参阅最高有效位)。相反,小端系统将最低有效字节存储在最小地址中。
这是完全有道理的,这是我一生中 big/small 字节序的定义,直到我遇到与密码学相关的各种讨论:
书 "Cryptography for Developers" 作者:Tom St Denis 说,"the OS2IP function converts the octet string to integer by loading the octet strings in big endian fashion. That is, the first byte is the most significant."
https://crypto.stackexchange.com/questions/10824/what-does-an-rsa-signature-look-like/10826#10826 在这个问题的公认答案中,它说,"The padded value is then interpreted as an integer x, by decoding it with the big-endian convention."
显然,这两个加密讨论不涉及任何与机器架构相关的内容。他们对大端 fashion/convention 的定义是什么?
大端和小端只是用字节表示数字的约定。在 big endian 中,最重要的字节在前,在 little endian 中则相反。不同的架构、数据格式、算法和网络协议可能采用不同的策略。
此外,好的程序不会依赖于体系结构的字节顺序,例如,要从数组中读取一个数字,您可以这样写:
int read_bit_endian_16(unsigned char *data) {
return (data[0] << 8) + data[1];
}
或使用像 ntohs()
和朋友这样的功能。
在 Python 中是:
struct.unpack('>h', data)
如果您希望二进制数据格式是跨平台的,那么二进制数据格式就是字节顺序很重要的一个很好的例子。如果您在低端平台上写入数据,您希望能够在大端平台上读取它。这就是为什么任何体面的格式都会明确指定这些东西,并且可移植程序会考虑在不同体系结构中成为 compiled/run 的可能性。其他示例是多字节字符编码,如 UTF16-LE 和 UTF16-BE。
你可以找到更详细的解释here