如何解释 #if/#else 位域?(VC++菜鸟)
How do I interpret an #if/#else bitfield? (VC++ noob)
>背景: 我有一个错误的程序,可以反编译一组特定的文件。这些错误与它正在反编译的记录无关,只是一些辅助的东西。我正在将程序移植到 AHK 以清理错误并添加一些功能。
问题: 它反编译的每个特定文件都引用该文件中每条记录的映射结构。其中大多数都很容易确定。我在其中一个中遇到了位域表达式,我对如何阅读它有点困惑:
#if 1
unsigned char vCombinedBits1;
unsigned char vCombinedBits2;
#else
unsigned char iPadding1_1 : 3;
unsigned char vdirect : 1;
unsigned char vitemspecific : 1;
unsigned char vdamagerelated : 1;
unsigned char vSigned : 1;
unsigned char vSendmyspOther : 1;
unsigned char iPading1 : 1;
unsigned char iPading1_1 : 1;
unsigned char vCSvSigned : 1;
unsigned char vSaved : 1;
unsigned char vfCallback : 1;
unsigned char vfMin : 1;
unsigned char vUpdateAnimRate : 1;
unsigned char iPadding1_2 : 1;
#endif
我对If/Else逻辑并不陌生,但我对Visual C++am
陌生。
基于这个和那个,我假设的最终结果是:本质上,我将只读取两个字节而不考虑 vCombinedBits1 值并将每个位映射到我需要的变量。
我假设0x01 0x14样本 (0000 0001 0001 0100( 将像这样映射是否正确:iPadding1_1 = 0
iPadding1_1 = 0
iPadding1_1 = 0
vdirect = 0
vitemspecific = 0
vdamagerelated =0
vSigned =0
vSendmyspOther = 1
iPading1 = 0
iPading1_1 = 0
vCSvSigned = 0
vSaved = 1
vfCallback = 0
vfMin = 1
vUpdateAnimRate =0
iPadding1_2 =0
?
在这里找到整个结构,#if 从第 649 行开始
#if 1
的意思是"包括以下所有内容,直到#else
";它后面的两行是代码的一部分。由于#if
条件为真,因此#else
的意思是"忽略接下来的一切,直到#end
;其余行不是代码的一部分。就好像代码已经写好了一样
unsigned char vCombinedBits1;
unsigned char vCombinedBits2;
本质上,我将只读取两个字节,而不考虑 vCombinedBits1 值,并将每个位映射到我需要的变量。
还行。
我假设0x01 0x14样本(0000 0001 0001 0100(将像这样映射是否正确:...
差一点。位字段中位的排序取决于特定的编译器 (TL;DR(和你假设大端序。但是在VC++编译器的情况下,它是小端序的。为了判断你的假设是否正确,我们需要查看解码为位的实际数据样本。如果希望此代码可移植到任何(未知(编译器和体系结构,请不要使用位字段来解码外部数据。
阿门!
- C++Union/Struct位域的实现和可移植性
- 具有位域的结构的 Constexpr 构造函数
- 如何解释 #if/#else 位域?(VC++菜鸟)
- 枚举位域和聚合初始化
- 在有符号基础类型枚举的位域上溢出
- 如何检查位域是否跨越所有位
- 访问位域联合是C++标准中常见的初始数据未定义行为
- 锈迹位域和枚举C++样式
- C/C++:uint8_t位域的行为不正确且不一致
- 如何将位域写入二进制文件
- 字节序和大小为 1 的位域
- 面向对象编程 - 位域私有结构的公共参考
- 使用位域的结构大小不正确
- 在 mingw 的 gcc-5.3 下具有混合位域和枚举递减的结构的意外大小
- 如何将位域成员的所有位设置为 1
- 带有 C++ 位域的匿名 typedef 的前向声明
- 通过套接字C++发送时,位域值会更改
- 有符号的 int 会中断较大位域的某些部分
- 位域.为什么没有输出
- 忽略注意:在不使用"-Wno-packed-bitfield-compat"的情况下对打包位域进行偏移