在Python中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中做到这一点。
那这两行代码在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)