Я хочу преобразовать четырехбайтовую строку в int32
или uint32
в c ++. Этот ответ помог мне написать следующий код:
#include <string>
#include <iostream>
#include <stdint.h>
int main()
{
std::string a("\xaa\x00\x00\xaa", 4);
int u = *(int *) a.c_str();
int v = *(unsigned int *) a.c_str();
int x = *(int32_t *) a.c_str();
int y = *(uint32_t *) a.c_str();
std::cout << a << std::endl;
std::cout << "int: " << u << std::endl;
std::cout << "uint: " << v << std::endl;
std::cout << "int32_t: " << x << std::endl;
std::cout << "uint32_t: " << y << std::endl;
return 0;
}
Однако выходные данные все те же, где значения int
(или int32_t
) верны, нонеподписанные не правы.Почему не работает беззнаковое преобразование?
// output
int: -1442840406
uint: -1442840406
int32_t: -1442840406
uint32_t: -1442840406
Питоны struct.unpack
, дает правильное преобразование
In [1]: import struct
In [2]: struct.unpack("<i", b"\xaa\x00\x00\xaa")
Out[2]: (-1442840406,)
In [3]: struct.unpack("<I", b"\xaa\x00\x00\xaa")
Out[3]: (2852126890,)
Я также хотел бы, чтобы подобное решение работало для int16
и uint16
, но обо всем по порядку, так как я предполагаю, что расширение будет тривиальным, если мне удастся решить эту проблему.