golang实现TLV编码
2017年11月17日 · 146 字 · 1 分钟
TLV编码基础
golang实现
主要使用bytes和binary包中的相关函数
编码
func Encode(tag int32, data string) ([]byte, error) {
buf := new(bytes.Buffer)
// 写入TAG
if err := binary.Write(buf, binary.BigEndian, tag); err != nil {
return nil, err
}
dataBuf := []byte(data)
// 写入length
if err := binary.Write(buf, binary.BigEndian, int32(len(dataBuf))); err != nil {
return nil, err
}
// 写入数据
if err := binary.Write(buf, binary.BigEndian, dataBuf); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
解码
func Decode(b []byte) (int32, string, error) {
buf := bytes.NewBuffer(b)
var tag, length int32
// 读取tag
if err := binary.Read(buf, binary.BigEndian, &tag); err != nil {
return 0, "", err
}
// 读取length
if err := binary.Read(buf, binary.BigEndian, &length); err != nil {
return 0, "", err
}
// 读取数据
dataBuf := make([]byte, length)
if err := binary.Read(buf, binary.BigEndian, &dataBuf); err != nil {
return 0, "", err
}
return tag, string(dataBuf), nil
}
由于TLV编码容易上手加上golang完善的API,实现TLV编码也不算太曲折。