[网络开发]RakNet翻译文档(6)——Bitstream

作者: NickYang 分类: 技术文章,程序开发 发布时间: 2012-06-10 17:09

Bitstream概述

Bitstream类是一个RakNet命名空间下的helper类,是一个用于打包、解包bits的动态数组。它有如下四个优点:

1.动态的创建数据包

2.压缩

3.写入Bits

4.字节序转化

对于结构体打包来说,需要预定义结构体,并将他们转化为一个(char*)的类型。使用Bitstream,你可以在运行时根据上下文选择写入数据块。Bitstreams可以使用SerializeBitsFromIntegerRange()和SerializeFloat16()函数压缩原有的数据类型。

当然了,你还可以写入Bits。大多数时间下你不需要关心这些事情。然而,当写入布尔值时它会自动仅仅写入一个Bit位。这种方式在加密中非常有效,因为你的数据不再是按照字节对齐。(译者注:使得破解者无法获取你的数据结构)

 

写入数据

Bitstream是一个可以带任何数据类型的模板类。如果是一个内建的数据类型(译者注:指的是非自定义的数据类型),例如NetworkIDObject,它使用了局部模板特化来更有效的写入数据类型。如果它是一个原生类型或者一个结构体,他写入一个单独的bits,与memcpy()有些类似。你可以传递包含多个数据成员的结构体给bitstreams。然后,你需要序列化每一个单独的元素以纠正字节序。(例如:在PC和Mac之间通讯需要如此)

可选的 —— 其中的一个构造函数是以字节长度为参数。如果你清楚传递的数据长度,你可以传递这个数给Bitstream的构造函数,可以避免创建bitstream时内部动态重新分配内存。

参见Creating Packets获得更多的细节。

 

读取数据

读取数据相对简单。创建一个bitstream,在构造函数中指定你的数据。

参见 Receiving Packets 获得完整的例子。

 

序列化数据

你可以通过使用BitStream::Serialize()替代Read()或者Write(),这样就可以使用相同的读写函数了。

参见 Receiving Packets 获得完整的例子。

 

有用的函数

参见BitSteam.h可以获得完整的函数列表

Reset 函数

重置字节流,清空所有数据

 

Write 函数

写入函数在字节流的结尾将数据写入。你应该使用类似的Read函数从bitstream中读取数据

 

Read 函数

读取函数按照从头到尾的顺序读取bitstream中已经存在的数据。如果bitstream中没有任何数据,Read函数返回false。

 

WriteBitsFromIntegerRange, ReadBitsFromIntegerRange,SerializeBitsFromIntegerRange 函数

如果一个数字知识使用的特殊的值区间(例如 10-20),当比特数写入那个值区间内,这个函数将会自动。

 

WriteCasted, ReadCasted 函数

写一个类型的变量,当他需要被转化为其他数据类型。例如:WriteCasted< char >( 5 )等同于 char c = 5; Write( c );

 

WriteNormVector, ReadNormVector 函数

写入一个常规的向量,其中每一个元素的范围都是-1 — 1。每一个元素有16位。

 

WriteFloat16, ReadFloat16 函数

给出浮点数的最大最小值,以65535划分区间,将结果写入到一个16字节里(精度有损)。

 

WriteNormQuat, ReadNormQuat 函数

写入一个四元数到16 * 3 + 4位数据中(精度有损)。

 

WriteOrthMatrix, ReadOrthMatrix 函数

转化一个正交矩阵为四元数,然后调用WriteOrthMatrix/ReadOrthMatrix函数

 

GetNumberOfBitsUsed, GetNumberOfBytesUsed

给出已写入的字节或者位的大小。

 

GetData 函数

给出bitstream内部数据的指针。他是一个由malloc分配的(char*)指针,在你需要直接访问bitstream的数据时使用。

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注