RLP编码就是一种数据序列化的方式
RLP编码用来传输字节数组和列表,RLP里处理的最小单位是字节
什么是字节数组
比如要传输“abc”这样一个字符串,最后编码完一定是字节的形式,也就是二进制的形式, 像这样97 98 99,其中每个数字都是8位的二进制
列表形式
然后除了传字节数组(可以理解为字符串),还可以传列表, 比如["abc", "def"]
字符串如何转成字节数组
字符串如何转成字节数组这个根据字符串采用的编码方式,自己转换,这里的编码方式是指UTF8编码这种, 比如有的编码可能a转成字节是数字97,有的可能是79,这个不一定的,但是RLP不管你怎么转换过来的, RLP只处理转换之后的字节,即只处理97或79这个字节,这个97代表什么,RLP不会管
RLP怎么编码、解码
RLP编码解码有一套规则,主要就是用一个字节来表示后面的是什么
根据编码结果第一个字节f的大小,执行以下的规则判断:
1. 如果f∈ [0,128), 那么它是一个字节本身。
2. 如果f∈[128,184),那么它是一个长度不超过55的byte数组,数组的长度为 l=f-128
3. 如果f∈[184,192),那么它是一个长度超过55的数组,长度本身的编码长度ll=f-183,然后从第二个字节开始读取长度为ll的bytes,按照BigEndian编码成整数l,l即为数组的长度。
4. 如果f∈(192,247],那么它是一个编码后总长度不超过55的列表,列表长度为l=f-192。递归使用规则1~4进行解码。
5. 如果f∈(247,256],那么它是编码后长度大于55的列表,其长度本身的编码长度ll=f-247,然后从第二个字节读取长度为ll的bytes,按BigEndian编码成整数l,l即为子列表长度。然后递归根据解码规则进行解码。
如果这个列表里有嵌套,可以递归使用以上的规则来编码和解码,,以上解释了什么叫递归长度前缀编码,这个名字本身很好的解释了编码规则。
比如如果有一个数据 ["abc", "def"] 那么传的时候类似这样 [97 98 99, 100 101 102]
因为"abc", "def"符合这个第二条条件
如果f∈[128,184),那么它是一个长度不超过55的byte数组,数组的长度为 l=f-128
所以要加上128 + 3 = 131
所以[97 98 99, 100 101 102]变成 [131 97 98 99, 131 100 101 102]
然后这个是个列表,符合
如果f∈(192,247],那么它是一个编码后总长度不超过55的列表,列表长度为l=f-192。递归使用规则1~4进行解码。
列表的长度是8,所以192 + 8 = 200
所以[131 97 98 99, 131 100 101 102]变成
200 131 97 98 99 131 100 101 102
解码的时候就是反着来,第一个数字是200,说明是一个列表,得到
[]
接着解析,看到131,说明是长度3的字节数组,然后取后面3位是97 98 99,可以得到
[97 98 99]
再接着解析又看到131,说明又是一个字节数组,然后后面是100 101 102,可以得到
[97 98 99, 100 101 102]
然后如果是UTF编码,可以得出97 98 99对应的是"abc", 100 101 102对应的是"def"
然后可以解码出最终的数据是["abc", "def"]