我正在研究一个脚本,基本上将一些样本数据输出为二进制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脚本来解析此数据:

有关解析的信息

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)

最佳答案

大字节序或小字节序定义了如何解释比一个字节长的字节序列,以及如何将其存储在内存中。维基百科将为您提供帮助。


  我真的只是想了解阅读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字节,字节解包数据。仅当解压缩数据时,字节序才起作用,代码中的所有其他IO调用都处理字节序列。

试用unpack() Byte Order, Size, and Alignment,您也可以使用所选的HEX编辑器查看文件数据。

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

10-07 19:11
查看更多