繁体   English   中英

如何在C ++中以二进制格式打包数据

[英]How to pack data in binary format in c++

说,我有二进制协议,其中前4位代表可以小于或等于10(十进制十)的数字值。

在C ++中,我可用的最小数据类型是char,长度为8位。 因此,在我的应用程序中,我可以在char变量中保留4位表示的值。 我的问题是,如果我必须将char值打包回4位以进行网络传输,如何将char值打包回4位?

您对char进行按位运算;

所以

  unsigned char packedvalue = 0;

  packedvalue |= 0xF0 & (7 <<4);
  packedvalue |= 0x0F & (10);

将最高4位设置为7,将最低4位设置为10

再次将它们拆箱

 int upper, lower;

 upper = (packedvalue & 0xF0) >>4;
 lower = packedvalue & 0x0F;

作为对该问题的一个额外答案-您可能还希望查看协议缓冲区 ,以找到一种编码和解码二进制传输数据的方式。

当然,只需使用一个字符作为您的值即可:

std::ofstream outfile("thefile.bin", std::ios::binary);

unsigned int n;  // at most 10!
char c = n << 4; // fits
outfile.write(&c, 1);  // we wrote the value "10"

低4位将保留为零。 如果它们也用于某些用途,则必须在编写c之前完全填充c 阅读:

infile.read(&c, 1);
unsigned int n = c >> 4;

好吧,这里有一个流行但不可携带的“位域”。 它们符合标准,但可能会在不同平台上创建不同的包装订单。 所以不要使用它们。

然后,您应该首选具有高度可移植性的移位和按位AND和OR运算符。 本质上,您需要处理更大的字段(对于TCP / IP协议,通常为32位),然后提取或替换位的子序列。 看到马丁的链接和索伦的答案。

您熟悉C的位域吗? 你只要写

struct my_bits {
  unsigned v1 : 4;
  ...
};

请注意,在位域上进行各种操作的速度较慢,因为编译器必须将它们拆包以进行加法处理。 我以为解压缩位域仍然比加法运算本身快,即使它需要多个指令,但仍然很开销。 按位运算应该保持非常快。 平等。

您还必须注意字节序和线程(有关详细信息,请参阅我链接的Wikipedia文章,但问题很明显)。 因为您说过“二进制协议”,所以无论如何都应该学习字节序(请参阅前面的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM