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编码也不算太曲折。