zoukankan      html  css  js  c++  java
  • 从ByteBuffer中解析整数

    前言

      在解析Redis返回的消息中,有类似 $5 redis 的数据返回,当我们解析这种数据的时候,先解析出5这个数字,然后在取后续的5长度的字符串。当时在解析数字这块卡住了,于是看了Jedis中的解析方式。

    解析核心代码

        private static long readLongCrLf(ByteBuffer buffer) throws AioDecodeException {
            long value = 0L;
            //是否是负数
            boolean isNeg = false;
            while (buffer.hasRemaining()) {
                byte b = buffer.get();
                if (b == '-') {
                    isNeg = true;
                    continue;
                }
                //CR
                if (isCr(b)) {
                    b = buffer.get();
                //LF
                    if (!isLf(b)) {
                        throw new AioDecodeException("unexpected redis server response");
                    }
                    break;
                } else {
                    //核心转换代码
                    value = value * 10 + b - '0';
                }
            }
            return isNeg ? -value : value;
        }
    }
    

    调用示例:

    byte[] body = "123456
    ".getBytes();
            long value =0;
            for (int i=0;i<body.length;i++) {
                if(body[i]=='
    '){
                    break;
                }
                value = value * 10 + body[i] - '0';
            }
     System.out.println(value);
     
    

    原理

      在ASCII码中:

    '0' 对应着 48,所以我们将byte值减去'0'即得到十进制的值。特此记录

  • 相关阅读:
    sed&awk 资料汇总 全是链接
    LeetCode Path 3Sum
    C++ mem_fun
    递归绑定
    查询当天数据
    清除script注入
    防注入查询
    我的最新分页
    群发邮件
    利用缓存
  • 原文地址:https://www.cnblogs.com/panzi/p/10220549.html
Copyright © 2011-2022 走看看