在Python中memcpy的替代方法是什么?

0 投票
2 回答
5176 浏览
提问于 2025-04-18 14:05

我在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中做到这一点。

那这两行代码在Python中该怎么写呢?

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

2 个回答

1

这个 struct 包可以帮你做到这一点。

import struct

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

你需要指定字符串的最大长度(这里是10)。你的C++版本不行是因为字符串的原始字节会包含一个指针,而不是字符串里面的字符。

2

这不是C语言中的memcpy的直接对应,但如果你想通过TCP发送一个对象,并在另一端重新构建它,pickle模块就是你需要的。

这个模块主要用于将对象存储在顺序文件或字符串中,并能在不同的系统之间进行读取。

编辑:以下是来自Python标准库手册的Python 3.4的示例:

对于最简单的代码,可以使用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)

下面的示例读取生成的序列化数据。

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)

撰写回答