Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99882
  • 博文数量: 18
  • 博客积分: 681
  • 博客等级: 中士
  • 技术积分: 295
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-17 13:33
文章分类
文章存档

2012年(8)

2011年(10)

分类: Python/Ruby

2012-09-02 15:02:20

MySQL客户服务端通信协议中的一个基本类型是长度编码的整型,即在位串中加入长度信息,在解码的时候必须根据这来进行解码。

当整数小于251(0xfb)时,使用一个字节来对整数进行编码;当整数大于251时,使用多个字节对整数进行编码,第一个字节为0xfc,0xfd,0xfe之一,0xfc表示该整数使用2个字节编码,后面2个字节未该整数的值;0xfd表示该整数使用3个字节编码,后面3个字节为该整数的值;0xfe表示该整数有8个字节,后面8个字节未该整数的值。
协议详细可以参考:

解码和编码的Erlang实现如下:
lenenc_int_encode(Int) when Int>=0, Int<16#fb ->
    <>;                
lenenc_int_encode(Int) when Int>=16#fb, Int<16#ffff ->
    <<16#fc:8, Int:16>>;      
lenenc_int_encode(Int) when Int>=16#ffff, Int<16#ffffff -> 
    <<16#fd:8, Int:24>>;
lenenc_int_encode(Int) when Int>=16#ffffff, Int<16#ffffffffffffffff ->
    <<16#fe:8, Int:64>>.

lenenc_int_decode(<>) ->
    Int;
lenenc_int_decode(<<16#fc:8, Int:16>>) ->
    Int;
lenenc_int_decode(<<16#fd:8, Int:24>>) ->
    Int;
lenenc_int_decode(<<16#fe:8, Int:64>>) ->
    Int.

阅读(3403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~