C++ 将不同的数据类型打包到一个 long 变量中

标签 c++ binary packing

我陷入了一个陷阱,试图将几个变量打包成一个 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/

相关文章:

c++ - 如何使用 boost::serialization 序列化对象 vector 作为属性的对象

java二进制文件操作

在 C 中将十进制整数转换为二进制字符串

java - JPackage在创建DMG之前将文件复制到应用程序的Resource文件夹中

c++ - 我们如何使用 boost::mpl 实现 Builder 设计模式?

c++ - boost 间隔矩阵

c++ - IFileOperation::DeleteItems 在 Windows 8 上不要求确认(与 Windows 7 不同)

python - 在 python 中将数字表示为两个幂之和的最快方法是什么

javascript - 打包 JavaScript 库后对象消失

c++ - 为什么包含 char、short 和 char(按此顺序)的结构在启用 4 字节打包的 C++ 中编译时会变成 6 字节结构?