Encoding 大端和小端混淆

Encoding 大端和小端混淆,encoding,cryptography,endianness,Encoding,Cryptography,Endianness,我已经看到了两个关于big-endian/small-endian的定义,这引起了我的混淆 第一个定义是与机器相关的经典定义: Big-endian系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(另请参见最高有效位)。相反,Little endian系统将最低有效字节存储在最小地址中 这很有道理,这是我一生中对big/small endian的定义,直到我遇到了与密码学相关的各种讨论: Tom St Denis的《开发者密码术》一书中说:“OS2IP函数通过以大端方式加载八

我已经看到了两个关于big-endian/small-endian的定义,这引起了我的混淆

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

Big-endian系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(另请参见最高有效位)。相反,Little endian系统将最低有效字节存储在最小地址中

这很有道理,这是我一生中对big/small endian的定义,直到我遇到了与密码学相关的各种讨论:

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

  • 在这个问题的公认答案中,它说,“然后通过使用big-endian约定对其进行解码,将填充值解释为整数x。”


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

    big-endian和little-endian只是关于用字节表示数字的惯例。在big-endian中,最高有效字节排在第一位,而在little-endian中则相反。不同的体系结构、数据格式、算法和网络协议可能采用不同的策略

    此外,好的程序不会依赖于体系结构的端性,例如,要从数组中读取数字,可以编写如下代码:

    int read_bit_endian_16(unsigned char *data) {
        return (data[0] << 8) + data[1];
    }
    
    如果您希望二进制数据格式是跨平台的,那么二进制数据格式就是endianness很重要的例子。如果您在低端平台中写入数据,则希望能够在大端平台中读取数据。这就是为什么任何合适的格式都会明确指定这些内容,而可移植程序会考虑在不同的体系结构中编译/运行的可能性。另一个例子是UTF16-LE和UTF16-be等多字节字符编码


    您可以找到一个更详细的解释

    大端/小端是关于用字节表示数字的(哪个字节先出现)。任何体系结构都必须对表示方式做出选择,只是在它们的术语中“优先”意味着“具有最小的地址”。除了计算机体系结构之外,还有数据格式、网络协议、加密算法等。或者我对这个问题的理解有误吗?但是在这些加密讨论的背景下,没有对机器或地址的假设。他们如何基于此确定地址?另一种解释我困惑的方式是,当数据存储在x86机器上时,如何解码big-endian约定中的值?(参见案例2)@bereal,在上述案例2中,此人似乎并不关心您如何在机器上存储。假设您有char buf[2]={0xA,0xB}。解码器将0xA解释为最高有效字节,无论其地址是否高于0xB。这是我的理解。但我不确定这是否就是big endian约定的定义。谢谢你的解释。但在你给出的例子中,我不认为机器的耐久性有任何影响。事实上,我还没有看到机器的末端会导致问题的场景。你能举个例子吗?我会在那之后接受你的回答。@dannycrane更新了,如果这回答了你的问题,请告诉我。链接非常有用!
    struct.unpack('>h', data)