我陷入了一个陷阱,试图将几个变量打包成一个 8 字节长的变量。
基本上,我有一些二进制文件较小的短项目,我需要将它们打包在一起以发送到必须能够将其解压回来的类。
所以我做了以下内容:
typedef unsigned long long PACKAGE; // 8 byte (shows as _int64 in debug)
(sizeof returns '8')
unsigned int dat1 = 25; // 1 byte long max
unsigned int dat2 = 1; // 4 bit long max
unsigned int dat3 = 100; // 2 byte long max
unsigned int dat4 = 200; // 4 byte long max
unsigned int dat5 = 2; // 4 bit long max
然后我创建一个 PACKAGE 类型的变量,它是空的 (0)
PACKAGE pack = 0;
我想使用二进制操作将变量放入该包中,我这样做:
pack = (dat1 << 56) | (dat2 << 52) | (dat3 << 36) | (dat4 << 4) | dat5;
它只工作了一半,我计算出我必须得到 pack 的十进制值等于 2526526262902525058
,或者
0010001100010000000001100100000000000000000000000000110010000010
作为二进制,但是我得到的是 588254914
,或者
00100011000100000000111011000010
为二进制
它的尾部和头部在某种程度上是正确的,但中间部分某处丢失了。
完成后,我仍将以某种方式提取数据。
最佳答案
我宁愿使用 bitfield表示这种类型的结构(也使用 uint64_t
来确定可用大小):
union PACKAGE {
struct bits {
uint64_t dat1 : 8; // 1 byte long max
uint64_t dat2 : 4; // 4 bit long max
uint64_t dat3 : 16; // 2 byte long max
uint64_t dat4 : 32; // 4 byte long max
uint64_t dat5 : 4; // 4 bit long max
};
uint64_t whole; // for convenience
};
如 comments 中所述你甚至可以使用 uint_least64_t
数据类型,以确保您的目标支持它(因为 uint64_t
的可用性在当前的 c++ 标准中是可选的):
union PACKAGE {
struct bits {
uint_least64_t dat1 : 8; // 1 byte long max
uint_least64_t dat2 : 4; // 4 bit long max
uint_least64_t dat3 : 16; // 2 byte long max
uint_least64_t dat4 : 32; // 4 byte long max
uint_least64_t dat5 : 4; // 4 bit long max
};
uint_least64_t whole; // for convenience
};
关于C++ 将不同的数据类型打包到一个 long 变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749590/