[讨论] 如何将一个结构体的 buffer 数据,拷贝到另一个结构体的实例中

1次阅读

共计 905 个字符,预计需要花费 3 分钟才能阅读完成。

背景

我有一个静态库 A,提供的头文件中有 public 的结构体和方法接口,以供别人调用

namespace api {

struct MyStruct {
    std::string text;
    int text_length;
};

std::string getStructInfo(const MyStruct &struct);

}

另一个静态库 B,依赖了静态库 A,其源码内实例化了一个 MyStruct 结构体对象,并调用了 getStructSize 方法获取了结果

静态库 A 和静态库 B 均以 二进制.a 形式集成到工程 App 中使用

问题

某一天,静态库 A 中的头文件 MyStruct 定义发生变化:

struct MyStruct {
    int text_length;
    float score;
    std::string full_text;
};

我想在 不重新构建静态库 B,保持 MyStruct 命名不变,使用新定义 的情况下,通过指针偏移或二进制适配手段,使静态库 B 内的代码逻辑能正常运行,应该如何进行处理?

我的想法是,由于 getStructSize 的参数是引用,所以打算通过上测算出老的结构体定义的大小,然后 memcpy 对应长度的 buffer 到一个和原结构体定义完全一致,但命名空间不一致的的结构体中,随后进行提取:

第一步:定义一个结构体,和原来的 MyStruct 完全一致,但通过命名空间隔离:

namespace old {

struct MyStruct {
    std::string text;
    int text_length;
};

}

第二步:在 getStructInfo 内部,进行转换

int getStructInfo(const MyStruct &struct) {size_t old_size = sizeof(old::MyStruct);
    old::MyStruct old_struct;
    memcpy(&old_struct, &struct, old_size);

    printf("old struct text:%s", old_struct.text.c_str());
    ……
}

总觉得这个方法是可以的,但实际操作的过程中就不行,无法获得 text 的值,这是为什么呢?求大神赐教下

补充信息:iOS 系统,arm64 架构

正文完
 0