如何解释 #if/#else 位域?(VC++菜鸟)

How do I interpret an #if/#else bitfield? (VC++ noob)

本文关键字:位域 VC++ 菜鸟 #else #if 何解释 解释      更新时间:2023-10-16

>背景: 我有一个错误的程序,可以反编译一组特定的文件。这些错误与它正在反编译的记录无关,只是一些辅助的东西。我正在将程序移植到 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++编译器的情况下,它是小端序的。为了判断你的假设是否正确,我们需要查看解码为位的实际数据样本。如果希望此代码可移植到任何(未知(编译器和体系结构,请不要使用位字段来解码外部数据。

阿门!