python中memcpy的替代方法是什么?

时间:2014-07-21 09:38:55

标签: python byte memcpy

我在python中有一个类对象。我想通过TCP发送该对象值。

我知道如果它是C ++我可以像下面那样发送..

class Abc
{
    int x;
    float y;
    string x;
};

Abc Obj;
char* data = new char[sizeof(Abc)];
memcpy(data, &obj, sizeof(Abc));
tcpsender.send(data);    // may be incorrect syntax

因此,数据将作为字节发送到目的地。

现在我必须在Python中这样做。

这两行的替代部分是什么。

/*
char* data = new char[sizeof(Abc)];
memcpy(data, &obj, sizeof(Abc));
*/

2 个答案:

答案 0 :(得分:2)

它不等同于C memcpy,但如果您的要求是通过TCP发送对象并重建另一侧的pickle模块,则适合您。

目标是将对象存储在顺序文件或字符串中并检索它们,包括跨不同的体系结构。

编辑:来自{3.4}的The Python Standard Library手册的示例:

对于最简单的代码,请使用dump()和load()函数。

import pickle

# An arbitrary collection of objects supported by pickle.
data = {
    'a': [1, 2.0, 3, 4+6j],
    'b': ("character string", b"byte string"),
    'c': set([None, True, False])
}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

以下示例读取生成的pickled数据。

import pickle

with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)

答案 1 :(得分:1)

struct包可以为您完成此操作。

import struct

fmt = 'if10p'
data = struct.pack(fmt, 42, 1.234, 'hello')
print struct.unpack(fmt, data)

您必须指定字符串的最大长度(此处为10)。您的C ++版本不起作用,因为字符串的原始字节将包含指针而不是sting中的字符。