C++从int转换为字节数组,然后将该字节数组转换回int,导致溢出
C++ convert from int to byte array, then convert that byte array back to int, cause overflow
我正在制作一个多人游戏,我在其中使用 CSocket 在服务器和客户端之间发送数据,我需要传输原始字节。所以我测试了如何从整数转换为字节数组和反转,这是我测试的:
int test1 = 257;
byte bytes[4];
copy(&test1, &test1 + 3, bytes);
int test2;
copy(bytes, bytes + 3, &test2);
cout << "Test " << test2 << endl;
打印出来的test2变量,不是257而是1,我想是因为byte(unsigned char)类型的大小是256,溢出了。无论如何我可以正确转换?
所有指针运算都将以基类型为单位进行。
对于指向 int
(int*
) 的指针,然后添加 3
将添加 3 * sizeof(int)
.
的字节偏移量
所以调用copy(&test1, &test1 + 3, bytes)
会将3
int
值复制到四个-字节数组。
要仅复制一个 int
然后添加 1
:
copy(&test1, &test1 + 1, bytes);
将任何指针视为指向数组第一个元素的指针可能会有所帮助。
对于 &test1
,它可以被视为指向单个 int
元素数组的第一个元素的指针。
如评论中所述(感谢约翰指出),您只需将 bytes
数组中的 三个 字节复制到 test2
。
结尾“迭代器”应该是超出 结尾的一个元素,它是指向bytes[4]
的指针。那就是你需要的
copy(bytes, bytes + 4, &test2);
您的代码已修复
int test1 = 257;
byte bytes[4];
copy((char*)&test1, (char*)&test1 + 4, bytes);
int test2;
copy(bytes, bytes + 4, (char*)&test2);
cout << "Test " << test2 << endl;
我把所有的指针都转换成char指针,而且我用的是+4而不是+3。 +3 只复制了三个字节,所以它没有复制最后一个字节。
我正在制作一个多人游戏,我在其中使用 CSocket 在服务器和客户端之间发送数据,我需要传输原始字节。所以我测试了如何从整数转换为字节数组和反转,这是我测试的:
int test1 = 257;
byte bytes[4];
copy(&test1, &test1 + 3, bytes);
int test2;
copy(bytes, bytes + 3, &test2);
cout << "Test " << test2 << endl;
打印出来的test2变量,不是257而是1,我想是因为byte(unsigned char)类型的大小是256,溢出了。无论如何我可以正确转换?
所有指针运算都将以基类型为单位进行。
对于指向 int
(int*
) 的指针,然后添加 3
将添加 3 * sizeof(int)
.
所以调用copy(&test1, &test1 + 3, bytes)
会将3
int
值复制到四个-字节数组。
要仅复制一个 int
然后添加 1
:
copy(&test1, &test1 + 1, bytes);
将任何指针视为指向数组第一个元素的指针可能会有所帮助。
对于 &test1
,它可以被视为指向单个 int
元素数组的第一个元素的指针。
如评论中所述(感谢约翰指出),您只需将 bytes
数组中的 三个 字节复制到 test2
。
结尾“迭代器”应该是超出 结尾的一个元素,它是指向bytes[4]
的指针。那就是你需要的
copy(bytes, bytes + 4, &test2);
您的代码已修复
int test1 = 257;
byte bytes[4];
copy((char*)&test1, (char*)&test1 + 4, bytes);
int test2;
copy(bytes, bytes + 4, (char*)&test2);
cout << "Test " << test2 << endl;
我把所有的指针都转换成char指针,而且我用的是+4而不是+3。 +3 只复制了三个字节,所以它没有复制最后一个字节。