Преобразование 4 байтов в подписанные и без знака целые - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу преобразовать четырехбайтовую строку в 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, но обо всем по порядку, так как я предполагаю, что расширение будет тривиальным, если мне удастся решить эту проблему.

1 Ответ

0 голосов
/ 24 ноября 2018

Вам необходимо хранить значения без знака в переменных без знака, и это будет работать:

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

int main()
{
    std::string a("\xaa\x00\x00\xaa", 4);

    int u = *(int *) a.c_str();
    unsigned int v = *(unsigned int *) a.c_str();
    int32_t x = *(int32_t *) a.c_str();
    uint32_t 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;
}

Когда вы преобразуете значение в значение без знака, а затем сохраняете его в переменной со знаком, компилятор подыгрывает.Позже, когда вы печатаете переменную со знаком, компилятор генерирует код для вывода выходных данных со знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...