【问题标题】:Explanation of HEX value representation and Endianess十六进制值表示和字节序的解释
【发布时间】:2015-06-04 01:12:44
【问题描述】:

我正在编写一个脚本,基本上将一些示例数据输出为二进制 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)

【问题讨论】:

  • 你的问题绝对不清楚! 解析输出是什么意思?
  • 为什么不直接使用维基百科——这很简单
  • 对某些人来说简单的事情,对其他人来说可能并不简单。因此,人们提出了一个帮助他人的社区的想法。
  • 实际上是否尝试过阅读相关内容?这不是教程网站。这个问题跑题了。
  • 你的问题到底是什么?

标签: c hex endianness


【解决方案1】:

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

我真的只是想了解阅读 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 - byte, 2 bytes, byte 解压数据。字节序只有在您解包数据时才会发挥作用,代码中的所有其他 IO 调用都处理字节序列。

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

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

【讨论】:

  • 谢谢,帮了大忙。
猜你喜欢
  • 2017-09-13
  • 2012-04-16
  • 2015-01-14
  • 1970-01-01
  • 2012-08-18
  • 2020-11-11
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多