因此,我希望将两个short
的信息保留为一个int
,以便稍后通过网络发送(这只是一个演示,此处没有网络代码)。我将每个short
数字的两个字节复制到prim
(原始)变量中。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
int main()
{
unsigned int prim = 0;
short major = 0x0001;
short minor = 0x0000;
prim = 0;
memcpy(&prim, &major, 2);
memcpy(&prim+2,&minor, 2);
std::cout << "Prim: " << prim << std::endl;
return EXIT_SUCCESS
}
如果我先复制major
,然后再复制minor
(如上面的代码所示),我会得到正确的输出:
Prim: 1
因为我的CPU是小端,所以二进制表示应该是:
10000000 00000000 00000000 00000000
但是,如果我更改了订单,则首先提到minor
然后再major
,这样:
memcpy(&prim, &minor, 2);
memcpy(&prim+2,&major, 2);
我得到0。
Prim: 0
为什么呢?应该是:
00000000 00000000 10000000 00000000
等于65536。
答案 0 :(得分:5)
将整数放入更大整数的更便携方式是转移。
uint16_t lo = 1;
uint16_t hi = 2;
uint32_t all = (hi << 16) + lo;
答案 1 :(得分:4)
因为&prim + 2
在&prim
之后指向8个字节(2×sizeof(int))。
您需要将其强制转换为char*
以使指针按字节数增加。
memcpy((char*)&prim+2, &major, 2);
答案 2 :(得分:2)
除了在计算正确的poiters时修复错误,你可以通过使用联合来避免所有这些指针计算:
#include <iostream>
union two_shorts_t {
unsigned int prim ;
struct shorts_t {
short major;
short minor;
} shorts;
} ;
int main ()
{
two_shorts_t values;
values.shorts.major=1;
values.shorts.minor=0;
std::cout << "Prim: " << values.prim << std::endl;
values.shorts.major=0;
values.shorts.minor=1;
std::cout << "Prim: " << values.prim << std::endl;
return 0;
}