gpt4 book ai didi

c++ - 是否有符合标准的方法来指定 C++ 中的字段偏移量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:49 30 4
gpt4 key购买 nike

我有一大块内存由外部代码填充,我正在尝试对其进行逆向工程。我不知道这个内存的完整结构,但我知道一些字段(例如, block 以名为“foo”的 int32 开始,在偏移量 0xC 处有一个名为“bar”的 double )。我想定义一个结构,本质上是将指向该内存块的指针重新解释为该结构,并使其对齐。我不确定这种技术是否有更传统的名称,但我将其称为创建“覆盖类型”。

这是我希望能够做的事情的草图:

START_OVERLAY_TYPE(my_type, 0xFF) // struct named my_type, size 0xFF
FIELD(0x00, int32_t foo); // field int32_t foo at 0x00
FIELD(0x0C, double bar); // field double bar at 0x0C
END_OVERLAY_TYPE

不必使用宏会是一个加号,但我没有找到解决它们的好方法。

在我目前的实现中,我将其扩展为(类似于):

__pragma(pack(push, 1))
template<size_t p> struct padding_t { unsigned char pad[p]; };
template<> struct padding_t<0> {};
struct my_type
{
union
{
struct : padding_t<0xFF> {}; // ensure total size is 0xFF
struct : padding_t<0x00> { int32_t foo; }; // field at 0x00
struct : padding_t<0x0C> { double bar; }; // field at 0x0C
};
};
__pragma(pack(pop))

这编译并工作得很好,至少在我试过的 clang、gcc 和 VC++ 版本中(对 pragma 进行了适当的更改)。不幸的是,由于匿名结构的非标准使用,警告比比皆是。

有没有什么办法既能达到同样的效果又不超过标准?要求是它的声明相当简单(就像当前的宏一样),并且对于消费者来说,用法与

struct my_type { int32_t foo; double bar; }

至少对于不经意的观察者而言。

当前的代码将适用于我的目的,我只是好奇是否有我忽略的更好的方法。

最佳答案

您可以对包含该值的内部结构使用隐式类型转换和赋值运算符来尝试类似的操作。这种方式不是使用未命名的结构,而是结构带有名称,但内部结构通过运算符重载成为未命名的部分。

我用一些客户端代码(传递给函数、获取/设置值)进行了尝试,一切似乎都很好。我当然有可能在某处错过了一个场景。

__pragma(pack(push, 1))
template<size_t p, typename t>
struct padding_t
{
unsigned char pad[p];
t val;
operator t () const {return val;}
operator t& () {return val;}
padding_t<p, t>& operator= (const t& rhs) {val = rhs; return *this;}
};
template<typename t> struct padding_t<0, t>
{
t val;
operator t () const {return val;}
operator t& () {return val;}
padding_t<0, t>& operator= (const t& rhs) {val = rhs; return *this;}
};
template<size_t p>
struct sizing_t
{
unsigned char pad[p];
};
struct my_type
{
union
{
sizing_t<0xFF> size; // ensure total size is 0xFF
padding_t<0x00, int32_t> foo; // field at 0x00
padding_t<0x0C, double> bar; // field at 0x0C
};
};
__pragma(pack(pop))

关于c++ - 是否有符合标准的方法来指定 C++ 中的字段偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23200415/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com