一日一点RakNet(58)--StringCompressor(字符串压缩器)

字符串压缩器(StringCompressor)概述

 

安全编码和解码字符串

       StringCompressor类位于StringCompressor.h文件中,它可以以一种安全的方式编码和解码字符串,避免过度运算。

 

       发送方:

       const char *str = "My string";

stringCompressor->EncodeString(str,TRUNCATION_LENGTH,&bitStream,languageId);

       接收方:

       char buffer[TRUNCATION_LENGTH];

stringCompressor->DecodeString(buffer, TRUNCATION_LENGTH, &bitStream, languageId);

       第一个参数是要编码或解码的字符串。第二个参数是写或读的最大字符数。如果字符串数大于这个参数,那么会按照本参数的大小发送字符串。第三个参数是要写入或读出的bitstream。最后一个参数表明使用什么样的字符频率表,两个系统上的两个表必须是相同的。

       字符串会被该类根据字符频率表使用胡夫曼编码进行压缩,由languageId指明该算法。默认的频率表参数使用0,它是在StringCompressor.h中使用englishCharacterFrequencies变量静态定义。要想加入你自己的频率表,使用想要用的languageID参数,来调用GenerateTreeFromStrings()方法设置。

       如果你的应用程序使用的是CString类,可以在StringCompressor.h中定义_CSTRING_COMPRESSOR来使该类支持CString字符串的压缩。

       类似地,如果你的应用程序使用的是std::string,可以在StringCompressor.h中定义_STD_STRING_COMPRESSOR来使该类支持对std::string字符串的压缩。

 

StringTable概述

预定义静态字符串减少带宽使用

       StringTable类是一个与StringCompressor类非常像的一个类,增加了一个AddString方法。

       void AddString(const char *str, bool copyString);

       str是要加入的字符串。

       如果你的字符串不是常量,copyString应该设置为true,如果在内存中是静态的,则设置为false(这个时候仅仅存储一个指针)

       AddString会检查内部的数据数组,查看是否这个字符串已经被注册了。如果没有,它会内在地为该标示符存储两个字节的标示符,用该标示符来代表这个字符串。那么进一步的发送将仅仅发送两个字节的标示符,而不是发送整个字符串,这样如果字符串有三个字符或更多,那么字符串的发送速度更快,也更加节省带宽。如果发送一个没有使用AddString加入的字符串,那么函数的动作与你直接调用stringCompressor一样,但是会多花费额外的一位。

       两个系统必须有相同的注册字符串集合,并且是按照相同的顺序注册,同时还要求系统在对应的发送和接收调用中使用StringTableStringCompressor

 

By 北洋小郭

转载请注明出处,请勿用于任何商业用途,谢谢!

 

 

 

 

你可能感兴趣的:(算法,String,存储,buffer)