golang面试

golang实现redis协议之10进制ascii码转义

2020-11-02  本文已影响0人  realPeanut

抓包返回如下

24 39 0d 0a 31 30 30 30 30 30 30 30 30 0d 0a

代表批量回复

代表value值为9位ASCII码,9字节


以上是分析的抓包数据


    r := bufio.NewReader(rc.Conn.conn)

    p, err := r.ReadSlice(redis_cut)
    ... 
    ln, err := io.ReadFull(r, rs)
[36 57 13 10] [49 48 48 48 48 48 48 48 48]
func ParseLen(p []byte) (int, error) {

fmt.Println(p)
    if len(p) == 0 {

        return -1, nil
    }

    if p[0] == '-' && len(p) == 2 && p[1] == '1' {
        return -1, nil
    }

    var n int
    for _, b := range p {
        n *= 10
        if b < '0' || b > '9' {
            return -1, nil
        }
        n += int(b - '0')
        //ascii运算相当于57-48
    }
    zjd := make([]byte,2)
    t[0] = 57
    println(t[0] - 48 )//方法1
    println(t[0] - '0' )//方法2

redis数据传输采用的小端法,我们不用过多处理
如果是其他协议采用大端法传输时,需要进行特殊处理。

上一篇 下一篇

猜你喜欢

热点阅读