将字节从较小的类型复制到较大的类型

时间:2012-02-10 09:43:47

标签: c++ memory

因此,我希望将两个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。

3 个答案:

答案 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;
}