1

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

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

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

4

3 回答 3

4

这两种方式分别是 mod/div 和 shift/mask,但实际上都是相同的方式。

模组/分区:

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
于 2012-12-19T00:01:53.163 回答
0

如果您不介意离开 C++ 并且您拥有一台 Linux 机器,您可以使用以下命令对它进行 sed:

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

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

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

于 2013-08-23T12:01:55.263 回答
0
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(拆分,0xffffffff,4);强文本

于 2015-02-23T17:43:52.757 回答