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

Copy bytes from smaller types to bigger type

本文关键字:类型 复制 字节      更新时间:2023-10-16

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

将整数放入较大整数的一种更便携的方法是移位。

uint16_t lo = 1;
uint16_t hi = 2;
uint32_t all = (hi << 16) + lo;

因为&prim + 2指向&prim之后的8个字节(2×sizeof(int))。

您需要将其强制转换为char*,以使指针增加字节。

memcpy((char*)&prim+2, &major, 2);

除了修复计算正确指针时的错误外,您还可以通过使用并集来避免所有这些指针计算:

#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;
}