最近我一直在研究自己的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)
{
...
}
答案 0 :(得分:2)
是的,有可能:
if (reinterpret_cast<uint32_t*>(data)[0] != 0xCAFEBABE)
{
...
}
根据您机器的结果,您必须与0xCAFEBABE
或0xBEBAFECA
进行比较。
答案 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字节,如果它们全部匹配则返回零 或者一个不同于零的值,表示如果它们更大 不要。