RLP

本文深入解析了RLP(Recursive Length Prefix)编码机制,涵盖了基本概念、编码规则、数据与长度编码流程等内容。针对不同类型的输入数据,如字符串、整数等,详细说明了短项、长项、短列表及长列表的编码方式。此外,还提供了具体的编码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RLP
Recursive Length Prefix

RLP元素:
item,list

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

编码规则:
<input> -> <length of data prefix> | <length of data prefix><data> | <input> | <length of data prefix>(<input>)+
<input> -> -128, 1-127
<data> -> (octet①)*
<length of data prefix> -> <length of length prefix> | <length of length prefix><length of data>
<length of length prefix> -> octet②


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


<length of length prefix> > <offset long list> -> <long list>

<offset short list> <= <length of length prefix> <= <offset long list> -> <short list>

<offset long item> < <length of length prefix> < <offset short list> -> <long item>

<offset short item> < <length of length prefix> <= <offset long item> -> <short item>

<length of length prefix> = <offset short item> -> <null item>

<length of length prefix> < <offset short item> -> <single byte item>


编码规则:
<input> -> <length of data prefix> | <length of data prefix><data> | <input> | <length of data prefix>(<input>)+
<input> -> -128, 1-127
<data> -> (octet①)*
<length of data prefix> -> <length of length prefix> | <length of length prefix><length of data>
<length of length prefix> -> octet②


如果<offset short item> < <length of length prefix> <= <offset long item>
<input> -> <length of data prefix><data>
<length of data prefix> -> octet
octet -> L + <offset short item>


如果<offset long item> < <length of length prefix> < <offset short list>

<input> -> <length of data prefix><data>
<length of data prefix> -> <length of length prefix><length of data>
<length of length prefix> -> LL + <offset long item>
<length of data> -> (octet①)LL
L -> (octet[0] & 0xFF) << (8 * LL - 1) + (octet[1] & 0xFF) << (8 * LL - 2) + (octet[2] & 0xFF) << (8 * LL - 3) + ... + (octet[LL - 1] & 0xFF) << (8 * LL - LL)
<data> -> (octet②)L


如果<offset short list> <= <length of length prefix> <= <offset long list>

<input> -> <length of data prefix> | <length of data prefix><data> | <input> | <length of data prefix>(<input>)+
<length of data prefix> -> <length of length prefix> | <length of length prefix><length of data>
<length of length prefix> -> L + <offset short list>
<data> -> (octet)L


如果<length of length prefix> > <offset long list>

<input> -> <length of data prefix> | <length of data prefix><data> | <input> | <length of data prefix>(<input>)+
<length of data prefix> -> <length of length prefix> | <length of length prefix><length of data>
<length of data prefix> -> octet
octet -> LL + <offset long list>
<length of data> -> (octet①)LL
L -> (octet[0] & 0xFF) << (8 * LL - 1) + (octet[1] & 0xFF) << (8 * LL - 2) + (octet[2] & 0xFF) << (8 * LL - 3) + ... + (octet[LL - 1] & 0xFF) << (8 * LL - LL)
<data> -> (octet②)L


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

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


RLP
数据编码
<input> -> <length of data prefix> | <length of data prefix><data> | <input> | <length of data prefix>(<input>)+
<input> -> -128, 1-127
<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


input: (byte[0]) -> output: 0x80

input: (Object[0]) | (String[0]) | (Integer[0]) | (Long[0]) | (BigInteger[0]) -> output: 0xC0

input: (byte) 0 -> output: Unsupported type: Only accepting String, Integer and BigInteger for now

input: (byte[1]) -128, 0,1,2,...,127 -> output: -128, 0,1,2,...,127
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值