gpt4 book ai didi

c - 打包/解包缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:24 28 4
gpt4 key购买 nike

我正在编写一个简单的数据包序列化程序,但我很难为我的数据包创建 header 。我正在创建一个缓冲区,然后尝试将前两项加载到缓冲区中。我运行 memcopy 但缓冲区中实际上没有任何内容,然后当我尝试解压缩它时出现段错误。在线阅读示例我认为我做对了。任何帮助将不胜感激。

当打印出 uint 的值时,每个 uint 中都有数据。

void createHeader(int messageLength, char* message) {
uint16_t version = 457;
uint16_t htonsVersion = htons(version);
uint16_t length = messageLength;
uint16_t htonsLength = htons(length);
char buffer[142];
printf("%" PRIu16 "\n", version);
printf("%" PRIu16 "\n", htonsVersion);
printf("%" PRIu16 "\n",htonsLength);
printf("%" PRIu16 "\n",length);
memcpy(buffer+0, &htonsVersion, sizeof htonsVersion);
memcpy(buffer+2, &htonsLength, sizeof htonsLength);
printf("%s \n", "UNPACK");
uint16_t* testPacketVersion;
memcpy(testPacketVersion, buffer+0, sizeof buffer+0);
uint16_t* testPacketMessage;
//Segmentation fault happens here
memcpy(testPacketMessage, buffer+2, sizeof buffer+2);
char* returnMessage;

}

最佳答案

这个:

uint16_t* testPacketVersion;
memcpy(testPacketVersion, buffer+0, sizeof buffer+0);

是非常错误的。指针 testPacketVersion 未初始化,因此您将数据复制到内存中的随机位置。未定义的行为。

你甚至不应该有一个指针,因为你想创建一个实际的 uint16_t,它应该只是:

uint16_t testPacketVersion;
memcpy(&testPacketVersion, buffer+0, sizeof testPacketVersion);

我还更正了 sizeof 的用法,因为那完全是错误的。您想要为 uint16_t 复制尽可能多的字符。

关于c - 打包/解包缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18700583/

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