相对来说,我是个新手,所以我决定在这里发布一些代码。我的目标是对TCP流进行en-/解码。基于长度的单个数据包。前两个字节是以小端字节顺序表示的无符号大小。大小包括大小字段本身。我编写的方法看起来像预期的那样对数据包进行了en/解码。
是否有更有效的方法来实现这一点?也许已经在某个地方实现了这样的方法。
func GetPacketByLength(source io.Reader) ([]byte, error) {
s := make([]byte, 2)
if _, err := io.ReadFull(source, s); err != nil {
return nil, err
}
// Little-endian uint16
size := uint16(s[0]) | uint16(s[1])<<8 - 2
p := make([]byte, size)
if _, err := io.ReadFull(source, p); err != nil {
return nil, err
}
return p, nil
}
func PutPacketByLength(target io.Writer, p []byte) error {
s := make([]byte, 2)
// Little-endian uint16
s[0] = byte((len(p) + 2))
s[1] = byte((len(p) + 2) >> 8)
if _, err := target.Write(s); err != nil {
return err
}
if _, err := target.Write(p); err != nil {
return err
}
return nil
}发布于 2018-06-29 18:26:36
您可以考虑使用binary.Read。我发现这更易读和更自我记录。见这个例子。
var len uint16
err := binary.Read(buf, binary.LittleEndian, &len)写作部分:
len := uint16(len(p))
err := binary.Write(buf, binary.LittleEndian, len)另外,不要忘记检查len(p)是否溢出uint16 (小于65535)。
除此之外,您的代码也很好。
https://codereview.stackexchange.com/questions/197504
复制相似问题