gpt4 book ai didi

将 int 复制到不同的内存位置,接收比预期更多的字节

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

在获取 4 字节 int 中的长度后,尝试预先添加 2 字节的消息长度。我使用 memcpy 复制 2 个字节的 int。当我查看我复制的第二个字节时,正如预期的那样,但访问第一个字节实际上打印了 4 个字节。

我希望 dest[0] 和 dest[1] 都包含 1 个字节的 int。无论它是一个重要字节,还是切换了顺序...我可以在 memcpy 上添加一个偏移量或反转 0 和 1。它不一定是可移植的,我只是希望它能工作。

同样的错误发生在带有 LoadRunner 的 Windows 和带有 GCC 的 Ubuntu 中 - 所以我至少试图排除可移植性的原因。

我不确定我哪里出错了。我怀疑这与我最近缺乏使用指针有关?有没有更好的方法将 int 转换为 short,然后将其放入缓冲区的前 2 个字节?

char* src;
char* dest;
int len = 2753; // Hex - AC1
src=(char*)malloc(len);
dest=(char*)malloc(len+2);

memcpy(dest, &len, 2);
memcpy(dest+2, src, len);

printf("dest[0]: %02x", dest[0]);
// expected result: c1
// actual result: ffffffc1

printf("dest[1]: %02x", dest[1]);
// expected result: 0a
// actual result: 0a

最佳答案

您不能只是从一个四字节对象中随机取出两个字节并将其称为 short 转换。

在执行 memcpy 之前,您需要将 int 复制到两个字节的 int。

但实际上,这也不是最好的方法,因为您无法控制整数的字节顺序。

您的代码应如下所示:

dest[0] = ((unsigned)len >> 8) & 0xFF;
dest[1] = ((unsigned)len) & 0xFF;

那应该以网络字节顺序写出来,也就是大端。所有标准网络协议(protocol)都使用这种字节顺序。

然后我会添加如下内容:

assert( ((unsigned)len & 0xFFFF0000) == 0 ); // should be nothing in the high bytes

关于将 int 复制到不同的内存位置,接收比预期更多的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23369272/

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