为了账号安全,请及时绑定邮箱和手机立即绑定

Go 结构体和字节数组之间的转换

Go 结构体和字节数组之间的转换

Go
当年话下 2021-08-23 16:26:34
我正在用 Go 编写一个客户端 - 服务器应用程序。我想在 Go 中执行类似 C 的类型转换。例如在围棋中type packet struct {    opcode uint16    data [1024]byte}var pkt1 packet...n, raddr, err := conn.ReadFromUDP(pkt1)  // error here我还想执行类似 C 的 memcpy(),这将允许我将接收到的网络字节流直接映射到一个结构体。例如上面收到的pkt1type file_info struct {    file_size uint32       // 4 bytes    file_name [1020]byte}var file file_infoif (pkt1.opcode == WRITE) {    memcpy(&file, pkt1.data, 1024)}
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

我相信它们可以完美运行。但就我而言,我对解析作为网络数据包接收的 []byte 缓冲区更感兴趣。我使用以下方法来解析缓冲区。


var data []byte // holds the network packet received

opcode := binary.BigEndian.Uint16(data) // this will get first 2 bytes to be interpreted as uint16 number

raw_data := data[2:len(data)] // this will copy rest of the raw data in to raw_data byte stream

从结构体构造 []byte 流时,可以使用以下方法


type packet struct {

    opcode uint16

    blk_no uint16

    data   string

}

pkt := packet{opcode: 2, blk_no: 1, data: "testing"}

var buf []byte = make([]byte, 50) // make sure the data string is less than 46 bytes

offset := 0

binary.BigEndian.PutUint16(buf[offset:], pkt.opcode)

offset = offset + 2

binary.BigEndian.PutUint16(buf[offset:], pkt.blk_no)

offset = offset + 2

bytes_copied := copy(buf[offset:], pkt.data)

我希望这提供了关于如何将 []byte 流转换为 struct 并将 struct 转换回 []byte 流的一般概念。


查看完整回答
反对 回复 2021-08-23
  • 3 回答
  • 0 关注
  • 408 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信