go 二进制数据处理
以下是利用标准库binary来进行编解码
编码
①使用bytes.Buffer来存储编码生成的串
②使用binary.Write来编码存储在①的buf中
package main import ( "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] }
解码
①使用bytes.NewReader/bytes.Buffer来存储要解码的ascii串
②使用binary.Read来解码
package main import ( "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 }
Multi模式
-
解码
ing
-
编码
package main import ( "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进制整数的串? }
转自:http://studygolang.com/articles/713