[英]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位),然后提取或替换位的子序列。 看到马丁的链接和索伦的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.