以字节为单位打包golang中的结构以与C应用程序对话

以字节为单位打包golang中的结构以与C应用程序对话,c,struct,network-programming,go,C,Struct,Network Programming,Go,我有一个基于golang的客户端,它必须使用二进制协议与C守护进程通信。我无法更改服务器以支持json、xml或其他协议 在C代码中,我必须填写以下结构并通过网络发送: typedef struct pkt_struct{ int16_t pkt_version; int16_t pkt_type; u_int32_t crc32_v; int16_t ret_code; char buffer[1024]; }pkt; 要想知道,

我有一个基于golang的客户端,它必须使用二进制协议与C守护进程通信。我无法更改服务器以支持json、xml或其他协议

在C代码中,我必须填写以下结构并通过网络发送:

typedef struct pkt_struct{
    int16_t   pkt_version;
    int16_t   pkt_type;
    u_int32_t crc32_v;
    int16_t   ret_code;
    char      buffer[1024];
}pkt;
要想知道,我如何需要数据,它应该看起来像来自以下方面的输出:

$ irb
2.0.0-p353 :002 > [2, 1, 0, 0, 'version', 3].pack("nnNna1024n")
戈布就是答案吗?通读文档,看起来不是这样。也许是ProtoBuf

到目前为止,我所做的是:

import "encoding/binary"

....
type NPacket struct {
    packet_version int16
    packet_type int16
    crc32_value uint32
    ret_code int16
    buffer string
 }
 ....
 var pkt_send NPacket
 pkt_send = NPacket{2,1,0,0,"version"}
 buf := new(bytes.Buffer)
 if err := binary.Write(buf, binary.BigEndian, &pkt_send); err != nil {
        fmt.Println(err)
        os.Exit(1)
 }
我得到的错误:

binary.Write: invalid type string
仅适用于固定大小的对象。字符串可以是任意大小。相反,您可能希望复制C代码并使用固定大小的字节数组:

type NPacket struct {
    packet_version int16
    packet_type int16
    crc32_value uint32
    ret_code int16
    buffer [1024]byte
}
您可以使用
copy(pkt.buffer[:],“string”)
设置缓冲区



gob和protobufs都不是答案。它们都是编码格式,您无法控制数据的封送方式。

谢谢。即使我不喜欢使用的“方言”,我也会搜索它,看起来它是一种公认的模式