如何处理Golang中的字节运算符?

时间:2018-01-14 20:48:32

标签: go networking buffer packets

我想创建一个包含昵称和密码等信息的缓冲区。让我们说我已经创建了空缓冲区,这是

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

到那时我想填写数据,比如 buffer << nickname(string) << password(string),结果我得到

08 75 73 65 72 6e 61 6d 65 08 70 61 73 73 77 6f 72 64

len.nickname actual_nickname len.password password

现在,在我创建了这样的缓冲区之后,我想将它解析为变量。 这看起来像buffer >> nickname(string) >> password(string)

我在使用运算符的c ++中做过一次,但我不确定如何在Golang中这样做。

这些缓冲区将在我的网络应用程序中用作数据包正文。我不想使用结构,但有点像上面那样。

我希望我能正确解释我的问题。我也不想使用像:这样的分割器来将它们放到数组表中。

谢谢。

2 个答案:

答案 0 :(得分:-1)

尝试使用bytes.Buffer,您可以根据需要撰写,包括必要时使用fmt.Fprintf。当所有内容都写入缓冲区时,您可以将字节退回。

buf := bytes.NewBuffer(nil)
fmt.Fprint(buf, nickname)
fmt.Fprint(buf, password)
fmt.Print(buf.Bytes())

这里的工作示例:https://play.golang.org/p/bRL6-N-3qH_n

答案 1 :(得分:-1)

您可以使用encoding/binary包进行固定大小编码,包括选择字节顺序。

下面的示例写入两个字符串,前面是以网络字节顺序存储为uint32的长度。这适合通过电线发送。如果您确定这足以表示字符串长度,则可以使用uint16,甚至uint8

警告:我忽略了此示例代码中的所有错误。请不要在你的。

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

func main() {
    user := "foouser"
    password := "barpassword"

    // Write "len(user) user len(password) password".
    // Lengths are unsigned 32 bit ints in network byte order.
    var buf bytes.Buffer
    binary.Write(&buf, binary.BigEndian, (uint32)(len(user)))
    buf.WriteString(user)
    binary.Write(&buf, binary.BigEndian, (uint32)(len(password)))
    buf.WriteString(password)

    var output []byte = buf.Bytes()
    fmt.Printf("% x\n", output)

    // Now read it back (we could use the buffer,
    // but let's use Reader for clarity)
    input := bytes.NewReader(output)
    var uLen, pLen uint32

    binary.Read(input, binary.BigEndian, &uLen)
    uBytes := make([]byte, uLen)
    input.Read(uBytes)
    newUser := string(uBytes)

    binary.Read(input, binary.BigEndian, &pLen)
    pBytes := make([]byte, pLen)
    input.Read(pBytes)
    newPassword := string(pBytes)

    fmt.Printf("User: %q, Password: %q", newUser, newPassword)
}

这将输出字节数组和从中提取的字符串:

00 00 00 07 66 6f 6f 75 73 65 72 00 00 00 0b 62 61 72 70 61 73 73 77 6f 72 64
User: "foouser", Password: "barpassword"

playground link