首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python的struct.pack/unpack在C++中的等价性

Python的struct.pack/unpack在C++中的等价性
EN

Stack Overflow用户
提问于 2013-06-16 00:31:24
回答 6查看 8.6K关注 0票数 9

我在Python语言中使用struct.pack将数据转换为序列化的字节流。

代码语言:javascript
运行
复制
>>> import struct
>>> struct.pack('i', 1234)
'\xd2\x04\x00\x00'

C++中的等价性是什么?

EN

回答 6

Stack Overflow用户

发布于 2013-06-16 04:36:06

从长远来看,使用第三方库(例如Google Protocol Buffers)可能会更好,但如果您坚持使用自己的库,示例的C++版本可能如下所示:

代码语言:javascript
运行
复制
#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

相应的“解包”代码将如下所示:

代码语言:javascript
运行
复制
// 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的机器上工作:

代码语言:javascript
运行
复制
uint32_t htonf(float f)
{
   uint32_t x;
   memcpy(&x, &f, sizeof(float));
   return htonl(x);
}

……和相应的ntohf()来解压它们:

代码语言:javascript
运行
复制
float ntohf(uint32_t nf)
{
   float x;
   nf = ntohl(nf);
   memcpy(&x, &nf, sizeof(float));
   return x;
}

最后,对于字符串,您可以通过memcpy将字符串的字节添加到缓冲区(包括NUL终止符):

代码语言:javascript
运行
复制
const char * s = "hello";
int slen = strlen(s);
memcpy(myByteArray, s, slen+1);  // +1 for the NUL byte
票数 3
EN

Stack Overflow用户

发布于 2013-06-16 00:32:31

根本就没有。C++没有内置的序列化。

您必须将单个对象写入字节数组/向量,并且要小心endianness (如果您希望代码可移植)。

票数 1
EN

Stack Overflow用户

发布于 2013-06-16 00:45:18

你可以看看Boost.Serialization,但我怀疑你能不能让它使用与Python包相同的格式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17125690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档