2012-12-18 69 views
1

因为十六进制经常用来表示像RGBA颜色模型数据这样的东西,所以我试图找出如何去采取一个大的十六进制字符串像0x11AA22BB,并将其拆分为单独的字节。 (所以; 0x11,0xAA,0x22和0xBB块,基本上..)。我知道每个十六进制数字可以直接由四位表示。但是将一连串的零碎分成更小的群体并不是我知道如何去做的事情。如何将十六进制字符串拆分为字节?

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

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

+1

你是什么意思的“十六进制数”?一个字符串? – melpomene

+1

计算机中没有“十六进制数”这样的东西。你有一个二进制值的文本表示。你解析字符串并进行数学运算。或者你的意思是你有一个'int'并且想要读取每个字节? –

+0

我已将我的术语更改为'字符串',感谢您的信息。我意识到计算机中的所有数字都是二进制的表示形式。 – MrKatSwordfish

回答

2

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

啊,我明白了!感谢你的直接回答,Ignacio。所以它与将十进制数字分成几十,几百,几千等等非常相似。这对我来说非常合理,谢谢你的帮助。 – MrKatSwordfish

0

如果你不介意从C++退后几步你拥有一台Linux机器,你可以使用sed的吧:

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

首先命令删除0X前缀和由空格替换它们,所述第二命令拆分以字节为单位对序列并添加前缀每个部分。最后一个命令挤压空白。

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

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); strong text

相关问题