为了和之前的c++服务器连接,项目组给客户端更换底层,由于消息采用miniLZO压缩,于是在网上找了miniLZO for c#的版本,在这儿可以下载:
https://www.codeproject.com/Articles/16239/Pure-C-MiniLZO-port
但是运行时发现这个版本很容易崩溃,每次都是压缩的时候就崩溃了,
于是打断点进去看了一下,发现是字典表的越界访问,而且崩溃时总是在这一句:
index = D_INDEX1(ip);
pos = ip - (ip - dict[index]);
于是在这儿打断点跟进去看,发现出错的时候,index的值远大于65536。
在lzo的官网社区内找了一下,发现有人报告同样的错。解决方案也很简单:
就是在创建dict的时候,如果是64位系统,则用 131072 代替 65536 即可。
private const uint DICT_SIZE = 65536 + 3;
// 这一行替换成:
private const uint DICT_SIZE = 131072 + 3;