其实这个不算是一个坑,阿里实现的字符串协议挺好的,但是由于我个人的强迫症和在编写php客户端过程中对字符串的输出和解析感觉很别扭,尤其是字符串数据很大时,必须一个字节一个字节的判断处理,让我很郁闷,明显和我当年编写汇编时的哪种精致不符。体现在两个方面
1.字符串的格式定义为 字母S或者R + 两个字节的数据长度(MSB)+ utf8格式的字节数组,S表示最后一个块,上面那个长度是unicode
字符串的长度,不是自己数组的长度,即"中国"这个词,长度是2,utf8表示的字节数组确实6个字节
2.我的php客户端是用c混合c++编写的php扩展,输出字符串时首先调用libmbfl库计算unicode字符串的长度,然后输出utf8数据,因为在php中,我们默认采用utf8格式,字符串zval已经是utf8格式了,并且附带一个utf8长度的整数,
3.读取应答分析字符串时,根据上面的长度并不知道该分配多少内存来接受整个字符串,因为长度和utf8的字节长度根本没有关系,还有多个节时防止utf8字母被分配到多个不同的chunk上面
4.因此,我们重新定义了一个字符串数据协议, E +4字节UTF8字节长度(MSB)+ utf8表示一个完整的字符串,4字节时,表示的数据有2^31-1个utf8字节,可以表示好几百兆的汉字,够用了,这样我们可以使用c语言的memcpy函数进行快速数据拷贝和数据缓冲区分配了
5.经过测试,大量字符串的数据传输性能能提高5%