c - 尝试序列化包含 Unicode 文本的结构

标签 c windows

我正在尝试序列化一个包含多个成员的结构,其中包括几个 Unicode 文本字符串(wchar_t,编码为 Windows TCHAR),以便稍后保存到文件中。我想将其序列化为一个单元,而不是单独编写结构体的各个成员,因为需要保存许多不同的结构体(每个结构体都有自己的序列化函数),并且我希望能够通过一个结构体,一旦序列化,就会变成一个通用函数,该函数将在实际将其写入文件之前用一些元数据包装它(并将其添加到我也在创建的随附索引中)。

然而,虽然整数序列化和反序列化效果很好,但字符串一旦反序列化,就会显示为本质上随机的文本(每次都会改变)。

这是我的序列化函数:

PBYTE SerializeLanguage(language *Language){
    PBYTE SerializedLanguage;
    SIZE_T LanguageLen;
    UINT CurrentIndex = 0;

    LanguageLen = GetSerializedLanguageLength(Language);

    SerializedLanguage = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, LanguageLen);

    CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name_length), sizeof(Language->name_length));
    CurrentIndex += sizeof(Language->name_length);

    CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name), (lstrlen(Language->name) + 1) * sizeof(TCHAR));

    return SerializedLanguage;
}

还有我的反序列化函数:

VOID DeserializeLanguage(language *Out, PBYTE SerializedLanguage){
    UINT CurrentIndex = 0;

    CopyMemory(&(Out->name_length), &SerializedLanguage[CurrentIndex], sizeof(Out->name_length));
    CurrentIndex += sizeof(Out->name_length);

    Out->name = (PTCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Out->name_length);
    CopyMemory(Out->name, &SerializedLanguage[CurrentIndex], Out->name_length);

    MessageBox(NULL, Out->name, NULL, MB_OK);

    return;
}

最后是语言结构:

typedef struct language {
    UINT name_length;
    PTCHAR name;

    UINT script_name_length; /* Serialization for this and the following elements not yet implemented */
    PTCHAR script_name;
    BYTE min_level;
} language;

我已经使用调试器进行了检查,并且 language.name 已分配,并且已在调用 SerializeLanguage 的函数中正确分配。

定义了 UNICODE,以便调用相关函数的所有宽字符版本;这不是问题。

最佳答案

这是你的问题,在第二个参数中:

CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name), 
    (lstrlen(Language->name) + 1) * sizeof(TCHAR));

您正在复制指针,而不是内容。这应该有效:

CopyMemory(&SerializedLanguage[CurrentIndex], Language->name, 
    (lstrlen(Language->name) + 1) * sizeof(TCHAR));

关于c - 尝试序列化包含 Unicode 文本的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12764652/

相关文章:

c# - 如何确定连接的套接字是否使用 IPSec?

windows - 为了可读性,我应该在 Notepad++ 中使用什么语言选项和我的 Windows 主机文件?

c - 如何通过引用修改指向另一个结构内的结构数组的指针

c - 用 C 手动深度复制到设备

c - 从不兼容的指针类型传递参数 1 of 'x'

windows - Powershell Invoke-WebRequest 一直很慢。我怎样才能解决这个问题?

c# - 相当于c#中的换行符

c++ - 输出小数点后的两位数

c - 等待进程组时 waitpid() 没有子进程错误

c++ - Windows 服务无法识别网络路径。解决方法是什么?