将字节从较小的类型复制到较大的类型
Copy bytes from smaller types to bigger type
因此,我想将两个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;
}
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 平凡类型与非平凡类型的复制消除差异
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 具有 STL 向量类型成员的类的复制内存
- 如何确定捕获不可复制参数的 lambda 的类型?
- Google Sparsehash 在类型上使用 realloc(),这很难复制
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 我可以隐式地创建一个琐碎的可复制类型吗
- 模板类是否C++使用的每种指针类型复制代码
- 为什么我的链接数据类型复制构造函数不起作用?
- 将字节从较小的类型复制到较大的类型
- 哪个接口将字符串、数组和其他类型复制到相同类型的实例
- c++将内存从一种类型复制到另一种类型
- C++类类型复制初始化