最近在使用VC++做项目时遇到一个问题,在使用UDP通信时数据量太大导致无法发送,查阅资料后找到了一个使用union来压缩数据的办法。原理就是利用union内部定义的变量地址指向同一块内存,改变其中一个另一个也跟着改变。以下是代码
#include <iostream>
using namespace std;
typedef union Data_send{
int d_send; //压缩后的数据,int型占4字节,32位
struct Data { //原始数据
//定义占4位的int型数据,也就是只能存贮0000~1111,即-7~7,
int d1 : 4; //d1和d_send的高4位是同一块内存
int d2 : 4;
int d3 : 4;
int d4 : 4;
int d5 : 4;
int d6 : 4;
int d7 : 4;
int d8 : 4; //同理d8和d_send最低4位共享同一块内存
}data;
};
int main(){
Data_send test;
//原始数据赋值,因为定义的int只占了4位故只能存储0~7
test.data.d1 = 0;
test.data.d2 = 1;
test.data.d3 = 2;
test.data.d4 = 3;
test.data.d5 = 4;
test.data.d6 = 5;
test.data.d7 = 6;
test.data.d8 = 7;
int send = test.d_send;
cout << "发送的int数据:" << endl << send << endl;
Data_send rec;
//将接收到的int压缩数据用同一个union解析出原来的数据
rec.d_send = send;
cout << "int数据解析:" << endl;
cout << rec.data.d1 << endl;
cout << rec.data.d2 << endl;
cout << rec.data.d3 << endl;
cout << rec.data.d4 << endl;
cout << rec.data.d5 << endl;
cout << rec.data.d6 << endl;
cout << rec.data.d7 << endl;
cout << rec.data.d8 << endl;
system("pause");
return 0;
}
程序运行结果如下:
可以看到使用我们压缩过的数据成功还原了原始数据,我们只用了1个int数据发送了8个int型数据,极大程度上节省了空间。