打包/解压缩缓冲区

时间:2013-09-09 14:28:53

标签: c

我正在使用一个简单的数据包序列化程序,我很难为我的数据包创建标头。我正在创建一个缓冲区,然后尝试将前两个项加载到缓冲区中。我运行memcopy但实际上没有任何东西在缓冲区中结束,然后当我尝试解压缩时,我得到一个分段错误。在线阅读示例我认为我做得对。任何帮助将不胜感激。

当打印出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;

}

1 个答案:

答案 0 :(得分:2)

此:

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所需的任意数量的字符。