RLP (遞歸長度前綴)提供了一種適用于任意二進(jìn)制數(shù)據(jù)數(shù)組的編碼,RLP已經(jīng)成為以太坊中對(duì)對(duì)象進(jìn)行序列化的主要編碼方式。RLP的唯一目標(biāo)就是解決結(jié)構(gòu)體的編碼問題;對(duì)原子數(shù)據(jù)類型(比如,字符串,整數(shù)型,浮點(diǎn)型)的編碼則交給更高層的協(xié)議;以太坊中要求數(shù)字必須是一個(gè)大端字節(jié)序的、沒有零占位的存儲(chǔ)的格式(也就是說,一個(gè)整數(shù)0和一個(gè)空數(shù)組是等同的)。
如果想學(xué)習(xí)go語言中的反射用法,這個(gè)包里面倒是有比較完善的學(xué)習(xí)示例,感興趣的可以看看. 下面是我寫的一個(gè)使用示例,演示如何使用rlp這個(gè)包.
/*rlp包用法rlp目的是可以將常用的數(shù)據(jù)結(jié)構(gòu),uint,string,[]byte,struct,slice,array,big.int等序列化以及反序列化.要注意的是rlp特別不支持有符號(hào)數(shù)的序列化具體用法見下*///編碼type TestRlpStruct struct { A uint B string C []byte BigInt *big.Int }//rlp用法func TestRlp(t *testing.T) { //1.將一個(gè)整數(shù)數(shù)組序列化 arrdata, err := rlp.EncodeToBytes([]uint{32, 28}) fmt.Printf("unuse err:%v\n", err) //fmt.Sprintf("data=%s,err=%v", hex.EncodeToString(arrdata), err) //2.將數(shù)組反序列化 var intarray []uint err = rlp.DecodeBytes(arrdata, &intarray) //intarray 應(yīng)為{32,28} fmt.Printf("intarray=%v\n", intarray) //3.將一個(gè)布爾變量序列化到一個(gè)writer中 writer := new(bytes.Buffer) err = rlp.Encode(writer, true) //fmt.Sprintf("data=%s,err=%v",hex.EncodeToString(writer.Bytes()),err) //4.將一個(gè)布爾變量反序列化 var b bool err = rlp.DecodeBytes(writer.Bytes(), &b) //b:true fmt.Printf("b=%v\n", b) &