c++ - 如何解释#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 行开始
解决方案
本质上,我将只读取两个字节而不考虑 vCombinedBits1 值,并将每个位映射到我需要的变量。
好的。
我是否正确假设 0x01 0x14 (0000 0001 0001 0100) 的样本将像这样映射:...
不完全的。位字段中位的顺序取决于特定的编译器 (TL;DR),并且您假设大端顺序。但在 VC++ 编译器的情况下,它是 little-endian。要判断您的假设是否正确,我们需要查看解码为位的实际数据样本。如果您希望此代码可移植到任何(未知)编译器和体系结构,请不要使用位字段来解码外部数据。
阿门!
推荐阅读
- ansible - vars 中的 Ansible 变量操作
- arrays - 如何将 API 对象转换为数组
- excel - 执行每个循环后 VBA 清除剪贴板
- nuxt.js - 如何正确使用带有 Nuxt.js 路由器的堆分析?
- c++ - 涉及 c++20 概念时 gcc 和 clang 之间的行为不一致
- grpc - Java gRPC 处理客户端上没有可用的服务
- java - 我可以在我的 java 应用程序中放置一个 HTTP 代理服务来拦截所有 HTTP 请求并更改标头吗?
- pandas - 仅在几天内产生数据差异
- javascript - jquery过滤器的通配符
- python - Python Panda datareader - 跳过错误或不可用的代码值