【发布时间】:2019-11-06 12:08:39
【问题描述】:
这段代码,
uint32_t length;
BYTE* message;
printf("Inspecting message with length %d and contents: ", length);
for(int i=0;i<length;i++)
printf("%d ", message[i]);
printf("\n");
....
char* outbuff;
outbuff = (char*) malloc(sizeof(char) * length + sizeof(int));
uint32_t data_length = htonl(length);
memcpy(outbuff, &data_length , sizeof(int));
memcpy(outbuff + sizeof(uint32_t), message, length);
printf("Sending outbuff over network with length %d and contents: ", length);
for(int i=0;i<length;i++)
printf("%d ", outbuff[i]);
printf("\n");
不会忠实地将数据从消息和长度复制到输出缓冲区。但是一旦我将输出缓冲区的类型从 char* 更改为 BYTE*,它就可以正常工作了。
知道它为什么会这样吗? documentation 在这件事上没有帮助。
EDIT.1:将&length 更改为&data_length。我手动输入代码而不是在 SX 中复制。
EDIT.2:打印出 BYTE 数组的代码。
【问题讨论】:
-
你怎么知道它没有“忠实地从消息和长度复制数据”?您如何验证复制的内容?
-
这段代码很乱。当长度为
uint32_t时为什么要sizeof(int)?为什么分配给data_length却复制length? -
一个潜在的不相关错误是您复制了不一定是
int的对象的sizeof(int)字节。复制 uint32_t 时,应复制sizeof(uint32_t)字节。 -
(1)
sizeof(char)始终为 1,因此可以省略。 (2) @eerorika 是对的:在整个长度中使用uint32_t,尤其是sizeof:不能保证int是32 位的。 (3) 无论第一个指针的类型是什么,memcpy()都会起作用。 (但在添加时必须小心,如outbuff + sizeof(uint32_t),因为如果它指向大小大于 1 的类型,您将到达错误的地址。这在此处无关紧要,因为BYTE通常是unsigned char的 typedef。) -
@Someprogrammerdude Windows 中有一个
BYTE,是的。这个可能来自别的东西。请特别注意linux 标签。关键是我们不知道,猜测会适得其反。