前言
在解析Redis
返回的訊息中,有類似 $5\r\nredis\r\n
的資料返回,當我們解析這種資料的時候,先解析出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\r\n".getBytes();
long value =0;
for (int i=0;i<body.length;i++) {
if(body[i]=='\r'){
break;
}
value = value * 10 + body[i] - '0';
}
System.out.println(value);
原理
在ASCII碼中:
'0' 對應著 48,所以我們將byte值減去'0'即得到十進位制的值。特此記錄