HEX值表示和Endianess的说明

时间:2015-06-04 01:12:44

标签: c hex endianness

我正在编写一个脚本,基本上将一些示例数据输出为二进制blob。 我是软件领域的新实习生,依稀记得有关字节序的想法。

我意识到big-endian最重要的位从顶部开始,然后在内存块中运行。

如果我有0x03000201并且数据被解析为输出0 1 2,那么这是如何发生的以及如何使这些工作以位,字节等方式工作。

我想知道,在下面发布的示例中,当打印出存储在变量中的数据时,如何提取数字以形成0 1 2。

例如:我正在使用此文件创建几行二进制blob:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        FILE *file;
        int  buffer = 0x03000201;
        int  buffer2= 0x010203;
        file = fopen("test.bin", "wb");

        if (file != NULL)
        {
                fwrite(&buffer, sizeof(buffer), 1, file);
                fwrite(&buffer2, sizeof(buffer2), 1, file);
                fclose(file);
        }

        return 0;
}

然后我创建了一个Python脚本来解析这些数据:

关于Parse的信息

import struct
with open('test.bin','rb') as f:
    while True:
        data = f.read(4)
        if not data: break
        var1, var2, var3 = struct.unpack('=BHB', data)
        print(var1, var2, var3)

1 个答案:

答案 0 :(得分:0)

大端或小端字节定义如何解释长度超过一个字节的字节序列以及如何将这些字节存储在内存中。维基百科将帮助您。

  

我真的只是想了解读取2时的0x0300020   每次字节并重新打印产生0 1 2。

你一次不读2个字节,你读4个字节:data = f.read(4)

f.read(size) reads some quantity of data and returns it as a string.

使用= BHB - 字节,2字节,字节解压缩数据。只有在解压缩数据时,Endianness才会起作用,代码中的所有其他IO调用都会处理字节序列。

使用unpack() Byte Order, Size, and Alignment进行实验您还可以使用您选择的HEX编辑器查看文件数据。

如果在你的研究之后,你有一个具体的问题,请在这里问。