如果使用struct.pack(fmt,v1,v2,...)在python打包,如何在cpp中解压缩数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果使用struct.pack(fmt,v1,v2,...)在python打包,如何在cpp中解压缩数字相关的知识,希望对你有一定的参考价值。

在python中,我使用struct编码数字

struct.pack("<2q", 456, 123)

它回来了

'xc8x01x00x00x00x00x00x00{x00x00x00x00x00x00x00'

在cpp中,我如何将这样的字符串解码为整数元组?

答案

解压缩该字符串应该相当简单,您只需将字节复制到适当大小的整数:

#include <iostream>
#include <string>
#include <cstring>

int main()
{
  std::string input = std::string("xc8x01x00x00x00x00x00x00{x00x00x00x00x00x00x00", 16);
  for ( size_t i = 0; i < input.size() / 8; i++ )
  {
      int64_t value;
      memcpy(&value, &input[i*8], 8);
      std::cout << value << "
";
  }
}
另一答案

q很长,所以64位有符号整数。来自https://docs.python.org/3/library/struct.html

Format  C Type      Python type     Standard size
q      long long    integer         8

你可以读取这个缓冲区并复制到一个2长的数组(64位使用stdint.h定义)

#include <iostream>
#include <strings.h>
#include <stdint.h>

int main()
{
 // you're supposed to get that when reading the buffer from a file for instance:
 const unsigned char buffer[] = {0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,'{',0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 int64_t array[2];
 memcpy(array,buffer,sizeof(array));
 std::cout << array[0] << "," << array[1] << '
';
}

打印:

456,123

我没有在这里处理字节序。只是假设他们是一样的。但是如果你想要它,只需使用类型的大小交换字节,你就可以了。

以上是关于如果使用struct.pack(fmt,v1,v2,...)在python打包,如何在cpp中解压缩数字的主要内容,如果未能解决你的问题,请参考以下文章

golang 如何判断变量的类型

Go 语言中数据类型的判断

go语言之数据类型和格式化输出

go语言之函数

如何通过 Modbus TCP 使用“struct.pack”类型发送?

使用“struct.pack”将数据写入文件时出错