2015-10-19 169 views
0

最近我一直在使用我自己的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

回答

2

是的,这是可能的:

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

根据您的机器的endianes,你就必须比较0xCAFEBABE0xBEBAFECA

+0

static_cast不起作用,但reinterpret_cast会。 – tambre

+0

@tambre,你是对的。我已经编辑了我的解决方案。 – cdonat

0

尝试memcmp

比较的存储器由PTR1指向 块中的第一NUM通过PTR2指出字节的第一NUM个字节,返回零,如果它们都匹配 或不同于零表示的值如果它们不是 则更大。

http://www.cplusplus.com/reference/cstring/memcmp/

1

有几种方法可以做到这一点。

1.一个选项是使用uint32_t *

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

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

此选项的缺点是,它可能是不可移植的,因为这将是*val_4BytePtr结果将取决于“端”的政策(大端/小端)。

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的数据将始终具有相同的格式。

相关问题