因为十六进制通常用于表示像RGBA颜色模型数据这样的东西,所以我试图找出如何采用像0x11AA22BB这样的大型十六进制字符串并将其拆分为单独的字节。 (所以; 0x11,0xAA,0x22和0xBB块,基本上......)。我知道每个十六进制数字可以直接用四位表示。但是,将一系列比特分成更小的组并不是我知道该怎么做的。
所以,我确信这可能是一个简单的答案。我敢肯定它可能与将其转换为单个字节数组,或使用按位运算符或其他东西有关,但我无法弄明白。我知道还有一个字节序的问题以及字节是如何组织的(RGBA,ARBG,ABGR等),但是现在我只是想了解如何进行分割,这样我就可以大致了解这个怎么运作。我正在使用C ++,但我认为这可能不一定特定于该语言。
所以,重申一下; 如何获取像0x11AA22BB这样的大十六进制字符串并将其拆分为0x11,0xAA,0x22,0xBB?
答案 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); 强文