Cur*_*ous 4 c++ python go python-3.x
我有以下 python 类:
class Header:
def __init__(self, id, len):
self.id = id
self.len = len
h = Header(1, 10)
Run Code Online (Sandbox Code Playgroud)
如何将此类的实例序列化/编码h为bytes或bytearray,例如可以写入socket?
为了提供更多的视角,我需要将此对象写入一个 unix 域套接字,其中 C++ 程序正在侦听接收上述对象(它定义了与上面struct完全相同的内容,具有相同数量/类型的字段)。编码pickle.dump(...)无效。
结构C++是:
typedef struct Header {
uint32_t id;
uint32_t len;
}
Run Code Online (Sandbox Code Playgroud)
事实上,我可以C++从 与该程序进行交互Go,如下所示。
import (
"bytes"
"encoding/binary"
)
type Header struct {
ID uint2
Len uint32
}
// output of this function is written to the socket opened by C++ and it works!!
func GetHeaderBuf() *bytes.Buffer, error{
hdrBuf := new(bytes.Buffer)
hdr := Header{1, 10}
if err := binary.Write(hdrBuf, binary.LittleEndian, hdr); err != nil {
return nil, err
}
return hdrBuf, nil
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的Go是上面代码行的 python 等效项binary.Write(...)。
这称为序列化。
在Python中,您可以使用pickle自动执行(反)序列化的标准库模块,或手动序列化。在后一种情况下,您可以决定要编码的各个属性以及对它们进行编码的方式。然后struct模块进行实际的字节转换。
pickle方式:
data = pickle.dumps(h)
h2 = pickle.loads(data)
Run Code Online (Sandbox Code Playgroud)
手动方式:
假设我们需要 2 个字节来存储 id(小于 65636),需要 4 个字节来存储 len。我们可以做
data = struct.pack('>hi', h.ID, h.Len)
h2 = Header(*struct.unpack('>hi', data))
Run Code Online (Sandbox Code Playgroud)
Pickling 使用内部格式,并且只能在 Python 应用程序之间使用。另一方面,struct特别适合异构应用程序。这里>说整数值应该使用所谓的网络顺序(大)字节序。这简化了不同架构之间交换值的过程。
如果另一部分使用C语言,struct毫无疑问是可行的方法。