首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go中基于长度的帧流En-/Decoding

Go中基于长度的帧流En-/Decoding
EN

Code Review用户
提问于 2018-06-29 17:25:42
回答 1查看 56关注 0票数 4

相对来说,我是个新手,所以我决定在这里发布一些代码。我的目标是对TCP流进行en-/解码。基于长度的单个数据包。前两个字节是以小端字节顺序表示的无符号大小。大小包括大小字段本身。我编写的方法看起来像预期的那样对数据包进行了en/解码。

是否有更有效的方法来实现这一点?也许已经在某个地方实现了这样的方法。

代码语言:javascript
复制
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
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2018-06-29 18:26:36

您可以考虑使用binary.Read。我发现这更易读和更自我记录。见这个例子

代码语言:javascript
复制
var len uint16
err := binary.Read(buf, binary.LittleEndian, &len)

写作部分:

代码语言:javascript
复制
len := uint16(len(p))
err := binary.Write(buf, binary.LittleEndian, len)

另外,不要忘记检查len(p)是否溢出uint16 (小于65535)。

除此之外,您的代码也很好。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/197504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档