请您先登录,才能继续操作

浏览 1013 次
锁定老帖子 主题:RLP
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2018-04-05  
RLP
Recursive Length Prefix

RLP元素:
item,list

长度编码
数据编码
数据编码和长度编码采用的是相同的编码规则。

编码规则:
              <encoded data> -> <length of data prefix> | <length of data prefix><data> | <length of data prefix>(<encoded data>)+
                               <data> -> (octet①)*
   <length of data prefix> -> <length of length prefix> | <length of length prefix><length of data>
<length of length prefix> -> octet②




RLP
输入:
只支持String, Integer, Long以及BigInteger。
支持byte[]
数组,且不可以是原始数据类型的数组。
支持Object[],数组中的元素必须是1中指定的类型或者嵌套的数组(包括byte[]、Object[])。
数组支持嵌套

Integer和Long在内部都是按照BigInteger处理。








RLP
长list偏移
<offset long list>     -> 0xf7 -> 247(1111 0111)
短list偏移
<offset short list>   -> 0xc0 -> 192(1100 0000)
长item偏移
<offset long item>  -> 0xb7 -> 183(1011 0111)
短item偏移
<offset short item> -> 0x80 -> 128(1000 0000)





RLP
数据编码

              <encoded data> -> <length of data prefix> | <length of data prefix><data>
                               <data> -> (octet①)*
   <length of data prefix> -> <length of length prefix> | <length of length prefix><length of data>
<length of length prefix> -> octet②






RLP
长度编码

如果输入数据字节流长度L < 56(0011 1000):
    <length of data prefix>    -> <length of length prefix>
   
       <length of data prefix> -> <length of length prefix>
    <length of length prefix> -> octet
                                       octet -> L + <offset short item> | <offset short list>






RLP
如果255(0xff, 1111 1111) < 输入数据字节流长度L < 最大item长度(2^64):
       <length of data prefix> -> <length of length prefix><length of data>
                  <length of data> -> (octet①)+
                                             + -> <size of octet①>
                 <size of octet①> -> octet②
   <length of length prefix> -> octet③
                                 octet③ -> octet② + <offset short item> | <offset short list> + 56(0011 1000) - 1

如果56(0011 1000) <= 输入数据字节流长度L <= 255(0xff, 1111 1111):
       <length of data prefix> -> <length of length prefix><length of data>
                  <length of data> -> octet①
   <length of length prefix> -> octet②
                                 octet② -> 1 + <offset short item> | <offset short list> + 56(0011 1000) - 1





如果输入为空数组(empty)
0xC0
如果输入数据字节流长度为1且输入的这个字节<=短item偏移(0x80)
直接输出。如输入0,1,2,...,127,输出0,1,2,...,127




论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics