gpt4 book ai didi

c++ - C++ 中的 Python struct.pack/unpack 等价物

转载 作者:太空狗 更新时间:2023-10-29 21:55:23 26 4
gpt4 key购买 nike

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

>>> import struct
>>> struct.pack('i', 1234)
'\xd2\x04\x00\x00'

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

最佳答案

从长远来看,使用第三方库(例如 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(又名字符)和 bool 值非常简单,因为它们不需要字节序处理——您可以将它们中的每一个作为单个字节逐字复制到数组中。 uint16_t 可以通过 htons() 转换为大端,并通过 ntohs() 转换回 native 端。浮点值有点棘手,因为没有内置的 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

关于c++ - C++ 中的 Python struct.pack/unpack 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com