如何将十六进制字符串拆分为字节?

时间:2012-12-18 23:57:48

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

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

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

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

3 个答案:

答案 0 :(得分:3)

两种方式是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

答案 1 :(得分:0)

如果你不介意离开C ++而你拥有一台Linux机器,你可以使用以下方式进行调整:

  

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

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

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

答案 2 :(得分: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(split,0xffffffff,4); 强文