我在Python语言中使用struct.pack将数据转换为序列化的字节流。
>>> import struct
>>> struct.pack('i', 1234)
'\xd2\x04\x00\x00'C++中的等价性是什么?
发布于 2013-06-16 04:36:06
从长远来看,使用第三方库(例如Google Protocol Buffers)可能会更好,但如果您坚持使用自己的库,示例的C++版本可能如下所示:
#include <stdint.h>
#include <string.h>
int32_t myValueToPack = 1234; // or whatever
uint8_t myByteArray[sizeof(myValueToPack)];
int32_t bigEndianValue = htonl(myValueToPack); // convert the value to big-endian for cross-platform compatibility
memcpy(&myByteArray[0], &bigEndianValue, sizeof(bigEndianValue));
// At this point, myByteArray contains the "packed" data in network-endian (aka big-endian) format相应的“解包”代码将如下所示:
// Assume at this point we have the packed array myByteArray, from before
int32_t bigEndianValue;
memcpy(&bigEndianValue, &myByteArray[0], sizeof(bigEndianValue));
int32_t theUnpackedValue = ntohl(bigEndianValue);在实际生活中,您可能会打包多个值,这很容易做到(通过增大数组大小并在循环中调用htonl()和memcpy() --不要忘记在执行过程中增加memcpy()的第一个参数,这样第二个值就不会覆盖第一个值在数组中的位置,等等)。
您可能还想打包(又称序列化)不同的数据类型。Uint8_t(又称chars)和布尔值非常简单,因为它们不需要进行endian处理--您只需将它们作为单个字节逐字复制到数组中即可。Uint16_t可以通过htons()转换为big-endian,然后通过ntohs()转换回native-endian。浮点值有点棘手,因为没有内置的htonf(),但您可以使用自己的htonf()在符合IEEE754的机器上工作:
uint32_t htonf(float f)
{
uint32_t x;
memcpy(&x, &f, sizeof(float));
return htonl(x);
}……和相应的ntohf()来解压它们:
float ntohf(uint32_t nf)
{
float x;
nf = ntohl(nf);
memcpy(&x, &nf, sizeof(float));
return x;
}最后,对于字符串,您可以通过memcpy将字符串的字节添加到缓冲区(包括NUL终止符):
const char * s = "hello";
int slen = strlen(s);
memcpy(myByteArray, s, slen+1); // +1 for the NUL byte发布于 2013-06-16 00:32:31
根本就没有。C++没有内置的序列化。
您必须将单个对象写入字节数组/向量,并且要小心endianness (如果您希望代码可移植)。
发布于 2013-06-16 00:45:18
你可以看看Boost.Serialization,但我怀疑你能不能让它使用与Python包相同的格式。
https://stackoverflow.com/questions/17125690
复制相似问题