Как распаковать числа в cpp, если они упакованы в python, используя struct.pack (fmt, v1, v2, ...) - PullRequest
0 голосов
/ 14 сентября 2018

В Python я кодировал числа, используя struct

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

Возвращает

'\xc8\x01\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00'

В cpp, как я могу декодировать такую ​​строку в кортеж целых чисел?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

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 define)

#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] << '\n';
}

отпечатков:

456,123

Я не обращался с порядком байтов здесь.Просто предположил, что они были одинаковыми.Но если вы хотите этого, просто поменяйте местами байты, используя размер шрифта, и все готово.

0 голосов
/ 14 сентября 2018

Распаковать эту строку должно быть довольно просто, вы можете просто скопировать байты в целое число соответствующего размера:

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

int main()
{
  std::string input = std::string("\xc8\x01\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00", 16);
  for ( size_t i = 0; i < input.size() / 8; i++ )
  {
      int64_t value;
      memcpy(&value, &input[i*8], 8);
      std::cout << value << "\n";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...