2015-10-19 55 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的數據將始終具有相同的格式。

相關問題