在网络游戏开发中,通讯包设计中需要尽量减少数据长度,位操作属于程序基础,用在通讯包数据压缩上,是非常适和的。
今天我们进行一个最简单的数据压缩处理,将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));
}
}
}
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));
}
}
}
输出结果打印图片:
下一篇: