在网络游戏开发中,通讯包设计中需要尽量减少数据长度,位操作属于程序基础,用在通讯包数据压缩上,是非常适和的。

今天我们进行一个最简单的数据压缩处理,将8个bool压缩到1个byte里。

bool数据类型,大小为1bit,数值2进制显示0/1。

byte数据类型,大小为8bit,数值2进制显示00000000/11111111。

普通网络传输时,1个bool数据类型占据1字节,我们今天要做的是将8个bool数据类型压入1个字节中。

在这个示例中,取出bool值用了一个相对简单的方法,大家可以尝试用其他方法来取值,类似的例子很多。

using System;

public class 基础位操作
{
private const Int32 DEFAULT_BOOLS_LENGTH = 8;

private static byte 字节数据 = 0;

private static void 将布尔数据压入字节(bool 布尔数据,Int32 位索引)
{
int cache = 布尔数据 ? 1 : 0;
字节数据
|= (byte)(cache << 位索引);
}

private static bool 从字节读取布尔数据(Int32 位索引)
{
byte cache = (byte)(1 << 位索引);
return cache == (cache & 字节数据);
}

public static void 测试函数()
{
//初始化测试布尔数组
Console.WriteLine("初始化测试布尔数组");
bool[] bools = new bool[DEFAULT_BOOLS_LENGTH];
for (int i = 0; i < DEFAULT_BOOLS_LENGTH; i++)
{
bools[i]
= i % 2 == 0;
Console.WriteLine(
"当前是第{0}个布尔数据,值-> {1}", i + 1, bools[i]);
}
Console.WriteLine();
//压入字节
Console.WriteLine("压入字节");
for (int i = 0; i < DEFAULT_BOOLS_LENGTH; i++)
{
将布尔数据压入字节(bools[i], i);
}
Console.WriteLine(
"输出2进制字节数据-> {0}", Convert.ToString(字节数据,2));
Console.WriteLine();
//取出布尔数据
Console.WriteLine("取出布尔数据");
for (int i = 0; i < DEFAULT_BOOLS_LENGTH; i++)
{
Console.WriteLine(
"当前是第{0}个布尔数据,值-> {1}", i + 1, 从字节读取布尔数据(i));
}
}
}

输出结果打印图片:

下一篇:

网络通信基础:基础位操作(二)自定义DateTime数据类型

posted on 2011-06-29 17:35  醉卧天南  阅读(728)  评论(0编辑  收藏  举报