如何将char数组的多个元素与一个十六进制值进行比较?

时间:2015-10-19 11:43:16

标签: c++

最近我一直在研究自己的Java 8 Bytecode反编译器。我在以一种很好的方式检查类文件的魔力方面遇到了问题。

让我们说我有一个无符号的char数组,而0到3的元素是神奇的,总共有4个字节的魔法。

以下看起来不像是一种非常吸引人的方式来编写魔法检查:

if ((data[0] != 0xCA) && (data[1] != 0xFE) && (data[2] != 0xBA) && (data[3] != 0xBE))
{
...
}

是否可以用更短的方式书写?像:

if (data[0 to 4] != 0xCAFEBABE)
{
...
}

代码可用here,相关部分位于here

3 个答案:

答案 0 :(得分:2)

是的,有可能:

if (reinterpret_cast<uint32_t*>(data)[0] != 0xCAFEBABE)
{
...
}

根据您机器的结果,您必须与0xCAFEBABE0xBEBAFECA进行比较。

答案 1 :(得分:1)

有几种方法可以做到。

1.唯一的选择是使用uint32_t *

 uint32_t *val_4BytePtr = reinterpret_cast<uint32_t*>(data);

 if (*val_4BytePtr == 0x...)

此选项的缺点是它可能不可移植,因为*val_4BytePtr中的结果将取决于“endian”策略(big endian / little endian)。

2.Secont选项是组合这样的uint32_t

uint32_t val_4Byte = (static_cast<uint32_t>(data[3]) << 24) | 
                     (static_cast<uint32_t>(data[2]) << 16) | 
                     (static_cast<uint32_t>(data[1]) << 8) | data[0];

if (val_4Byte == 0x...)

在这种情况下,val_4Byte中存储的数据将始终具有相同的格式。

答案 2 :(得分:0)

尝试memcmp

  

比较ptr1指向的内存块的前几个num字节   ptr2指向的第一个num字节,如果它们全部匹配则返回零   或者一个不同于零的值,表示如果它们更大   不要。

the existing question