大端和小端混淆

时间:2015-04-15 05:25:56

标签: encoding cryptography endianness

我看到大端/小端的两个定义引起了我的困惑。

第一个定义是与机器相关的经典定义:

大端系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(也见最高有效位)。相反,小端系统将最低有效字节存储在最小地址中。

这很有道理,这是我一生中大/小端的定义,直到我遇到与密码学相关的各种讨论:

  1. 书籍“开发人员的密码学”作者:Tom St Denis说:“OS2IP函数通过以大端方式加载八位字节字符串将八位字节字符串转换为整数。也就是说,第一个字节是最重要的。”

  2. https://crypto.stackexchange.com/questions/10824/what-does-an-rsa-signature-look-like/10826#10826 在接受这个问题的答案中,它说,“填充值然后被解释为整数x,通过使用big-endian约定解码它。”

  3. 显然,这两个加密讨论不涉及与机器架构有关的任何事情。他们对big-endian时尚/惯例的定义是什么?

1 个答案:

答案 0 :(得分:1)

大端和小端只是用字节表示数字的约定。在big endian中,最重要的字节首先出现在小端,而另一种方式则是另一种方式。不同的体系结构,数据格式,算法和网络协议可能采用不同的策略。

此外,好的程序不依赖于架构的字节序,例如,从一个数组中读取一个数字,你可以编写类似的东西:

int read_bit_endian_16(unsigned char *data) {
    return (data[0] << 8) + data[1];
}

或使用ntohs()和朋友等功能。

在Python中它是:

struct.unpack('>h', data)

二进制数据格式是端点性很重要的好例子,如果您希望它们是跨平台的。如果您在低端平台上编写数据,您希望能够以big-endian平台读取数据。这就是为什么任何体面的格式明确指定这些事情,并且可移植程序考虑在不同体系结构中编译/运行的机会。其他示例是多字节字符编码,如UTF16-LE和UTF16-BE。

您可以找到更详细的解释here