這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
以下是利用標準庫binary來進行編解碼
解碼
①使用bytes.NewReader/bytes.Buffer來儲存要解碼的ascii串
②使用binary.Read來解碼
package mainimport ( "bytes" "encoding/binary" "fmt")func main() { var pi float64 bpi := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40} buf := bytes.NewReader(bpi) err := binary.Read(buf, binary.LittleEndian, &pi) // 這裡可以繼續讀出來存在變數裡, 這樣就可以解碼出來很多, 讀的次序和變數類型要對 // binary.Read(buf, binary.LittlEndian, &v2) if err != nil { fmt.Println("binary.Read failed:", err) } fmt.Print(pi) // 3.141592653589793}
編碼
①使用bytes.Buffer來儲存編碼產生的串
②使用binary.Write來編碼儲存在①的buf中
package mainimport ( "bytes" "encoding/binary" "fmt")func main() { var pi float64 = 3.141592653589793 buf := new(bytes.Buffer) err := binary.Write(buf, binary.LittleEndian, pi) // 這裡可以繼續往buf裡寫, 都存在buf裡 // binary.Write(buf, binary.LittleEndian, uint16(12345)) if err != nil { fmt.Println("binary.Read failed:", err) } fmt.Print(buf.Bytes()) // [24 45 68 84 251 33 9 64]}
Multi模式
解碼
ing
編碼
package mainimport ( "bytes" "encoding/binary" "fmt")func main() { buf := new(bytes.Buffer) var data = []interface{}{ uint16(61374), int8(-54), uint8(254), } for _, v := range data { err := binary.Write(buf, binary.LittleEndian, v) if err != nil { fmt.Println("binary.Write failed:", err) } } fmt.Printf("%x", buf.Bytes()) // beefcafe 這個是16進位串 // 這裡轉換為了16進位整數的串?}