【发布时间】:2019-02-14 08:17:02
【问题描述】:
背景: 我有一个错误的程序可以反编译一组特定的文件。这些错误与它正在反编译的记录无关,只是一些辅助的东西。我正在将程序移植到 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 逻辑并不陌生,但我 am 对 Visual C++ 并不陌生。
我假设的最终结果,基于this 和that:本质上,我将只读取两个字节而不考虑 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
?
找到整个结构 here,#if 从第 649 行开始
【问题讨论】:
-
#else和#endif之间的代码由于预处理器而被完全忽略 -
所以无论如何,我都会读取两个字节并相应地映射?我的示例地图正确吗?
标签: c++ visual-c++ structure porting bit-fields