【发布时间】:2014-01-15 13:21:18
【问题描述】:
我在我的一个项目中使用 C++11,想知道如何最好地表示 ELF 幻数。我不喜欢十六进制文字,所以我在寻找比以下更好的东西:
const uint32 ELF_MAGIC_NUMBER = 0x7F454c46; // 0x7F, E, L, F
所以,我试着写:
const uint32 ELF_MAGIC_NUMBER = { 0x7F, 'E', 'L', 'F' };
但是编译器抱怨初始化器列表中的项目太多,这可以理解,虽然很烦人。
有什么方法可以根据字节来编写整数文字吗?我觉得第一个选项虽然有效,但第二个选项不那么可读。
【问题讨论】:
-
第一个不必是可读的。这就是它的评论和名称的用途。我可能只是这么说,因为我认为你不会比十六进制文字更好。
-
是的,在转换中编码可能会花费与自己进行转换并包含评论一样多的努力。
-
const union { uint8_t c[4]; uint32 u; } ELF_MAGIC_NUMBER = { 0x7F, 'E', 'L', 'F' };,但这过于复杂了。 -
或者
const uint32 ELF_MAGIC_NUMBER = 0x7f << 24 | 'E' << 16 | 'L' << 8 | 'F';,但同样值得付出努力吗? -
@chris 对,但我必须查找 'E' => 45、'L' => 4c 和 'F' => 46 的映射。最好不要必须像那样打破我的流程,并且不要记住 ASCII 表。诚然,我只需要这样做一次,但许多幻数都是这样工作的。