首页 > 解决方案 > 如何解释#if/#else 位域?(VC++ 菜鸟)

问题描述

背景:我有一个错误的程序可以反编译一组特定的文件。这些错误与它正在反编译的记录无关,只是一些辅助的东西。我正在将该程序移植到 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++ 并不陌生。

我假设的最终结果是基于这个那个:本质上,我将只读取两个字节而不考虑 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 行开始

标签: c++visual-c++structureportingbit-fields

解决方案


本质上,我将只读取两个字节而不考虑 vCombinedBits1 值,并将每个位映射到我需要的变量。

好的。

我是否正确假设 0x01 0x14 (0000 0001 0001 0100) 的样本将像这样映射:...

不完全的。位字段中位的顺序取决于特定的编译器 (TL;DR),并且您假设大端顺序。但在 VC++ 编译器的情况下,它是 little-endian。要判断您的假设是否正确,我们需要查看解码为位的实际数据样本。如果您希望此代码可移植到任何(未知)编译器和体系结构,请不要使用位字段来解码外部数据。

阿门!


推荐阅读