【问题标题】:How do you split a hex string into bytes?如何将十六进制字符串拆分为字节?
【发布时间】:2012-12-18 23:57:48
【问题描述】:

因为十六进制经常用于表示诸如 RGBA 颜色模型数据之类的东西,所以我试图找出如何将像 0x11AA22BB 这样的大 十六进制字符串 分割成单独的字节。 (所以,本质上是 0x11、0xAA、0x22 和 0xBB 块……)。我知道每个十六进制数字可以直接用四位表示。但是,我也不知道如何将一串比特分成更小的组。

所以,我相信这可能有一个简单的答案。我确定它可能与将其转换为单字节数组或使用按位运算符或其他东西有关,但我无法弄清楚。我知道还有一个字节顺序问题以及字节的组织方式(RGBA、ARBG、ABGR 等),但现在我只是想了解如何进行拆分,以便对这个怎么运作。我正在使用 C++,但我认为这可能不一定特定于该语言。

所以,重申一下; 如何将 0x11AA22BB 这样的大十六进制字符串拆分为 0x11、0xAA、0x22、0xBB?

【问题讨论】:

  • “十六进制数”是什么意思?一个字符串?
  • 计算机中没有“十六进制数”之类的东西。你有一个二进制值的文本表示。您解析字符串并进行数学运算。或者你的意思是你有一个int 并且想要读取每个字节?
  • 我已将术语更改为“字符串”,感谢您提供的信息。我确实意识到计算机中的所有数字都是二进制的表示。

标签: language-agnostic numbers hex byte bit-manipulation


【解决方案1】:

这两种方式是mod/div和shift/mask,但实际上都是一样的方式。

mod/div:

num = 0x11aa22bb
while num > 0:
  byte = num % 0x100
  print hex(byte)
  num //= 0x100

移位/掩码:

num = 0x11aa22bb
while num > 0:
  byte = num & 0xff
  print hex(byte)
  num >>=8

【讨论】:

  • 啊,我明白了!感谢您的直截了当的回答,伊格纳西奥。所以它真的非常类似于将一个十进制数分成几十、几百、几千等。这对我来说非常有意义,谢谢你的帮助。
【解决方案2】:

如果您不介意放弃 C++ 并且您拥有一台 Linux 机器,您可以使用 sed:

sed 's/0x/ /g' 文件.hex | sed 's/[a-fA-F0-9]{2}/0x& /g' | tr -s''

第一个命令删除 0x 前缀并用空格替换它们,第二个命令将序列拆分为字节并将前缀添加到每个部分。最后一个命令挤压空格。

请注意,您可以通过删除文件名 (file.hex) 在标准输入上使用它。

【讨论】:

    【解决方案3】:
    void splitByte(unsigned char * split, unsigned int a,int quantBytes)
    {
      unsigned char aux;
      int i;
      for(i=0;i<quantBytes;i++)
      {
          split[i]=a&0x00FF; 
          a=(a>>8);
      }
      for(i=0;i<quantBytes-1;i++)
      {
          aux = split[i];
          split[i] = split[quantBytes-i-1];
          split[quantBytes-i-1] = aux;
    
      }
    }
    

    主要是:unsigned char split[4]; splitByte(split, 0xffffffff, 4);强文本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 2019-07-27
      • 2014-02-17
      • 2014-10-09
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多