как преобразовать пары символов шестнадцатеричной строки ostringstream в одно эквивалентное двоичное значение unit8_t - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь сделать следующее:

У меня есть собранный объект ostringstream, содержащий шестнадцатеричные данные для передачи. Скажем, это может быть

03125412349876543210af     (this is representing the data using hex convention in my string)

Эта строка представляет 11 байтов, поэтому, например, последний передаваемый байт - это 0xaf (два символа дают мне 8 бит фактических данных).

Я использую sh, чтобы прочитать каждую пару символов, например пару символов «03» в строке, и преобразовать ее в элемент uint8_t, который я sh перенесу в вектор элементов uint8_t. По сути, я создам новый вектор элементов uint8_t на основе содержимого строки, а затем передам вектор.

Моя тестовая программа ниже работает нормально для int, но не дает мне того, что я хочу для uint8_t. Есть ли элегантный и / или простой способ сделать то, что я пытаюсь сделать, что кто-нибудь может предложить?

(Примечание: пример 3 был для того, чтобы увидеть, что произойдет, если использовалось не шестнадцатеричное значение. пример 1, значение вроде 34r0 преобразует 34 (шестнадцатеричное) в эквивалентное int и игнорирует r и все, что следует за ним).

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    // example 1: making a hex string an int - works
    std::stringstream str1;
    std::string s1 = "5f";
    str1 << s1;
    int value1;
    str1 >> std::hex >> value1;
    cout << value1 << endl; // produces 95 - perfect

    cout << "~~~~~~~~~" << endl;

    // example 2: making a hex string a uint8 - not the result I want
    std::stringstream str2;
    std::string s2 = "5f";
    str2 << s2;
    uint8_t value2;
    str2 >> std::hex >> value2;
    cout << value2 << endl; // produces 5 - not what I want!

    cout << "~~~~~~~~~~~" << endl;

    // example 3: using non-hex values
    std::stringstream str3;
    std::string s3 = "wx";
    str3 << s3;
    uint8_t value3;
    str3 >> std::hex >> value3;
    cout << value3 << endl; // produces w - not what I want!

    // this does not work either
    uint8_t value4;
    cout << "~~~~~~~~~~~~~~" << endl;
    value4 = (uint8_t)value1;
    cout << value4 << endl; // produces - - not what I want!

    cout << "............." << endl;


    return 0;
}

Результат этой тестовой программы выглядит следующим образом:

Hello world!
95
~~~~~~~~~
5
~~~~~~~~~~~
w
~~~~~~~~~~~~~~
_
.............

Process returned 0 (0x0)   execution time : 0.022 s
Press any key to continue.

Пример 1 работает нормально, но использование int - это не то, что мне нужно.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Спасибо Мануэлю за его ответ. Это один из способов решения проблемы. Я все еще хотел бы знать, есть ли более элегантный способ сделать это.

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    // example 1: making a hex string an int - works
    std::stringstream str1;
    std::string s1 = "5f";
    str1 << s1;
    int value1;
    str1 >> std::hex >> value1;
    cout << "value 1 as int: " << value1 << endl; // produces 95 int - OK but an int
    uint8_t value2;
    value2 = (uint8_t)value1;
    cout << "value 2 as uint8: " << (int)value2 << endl; // produces 01011111 = 95 or '-' - correct

    return 0;
}

Что дает:

Hello world!
value 1 as int: 95
value 2 as uint8: 95

Process returned 0 (0x0)   execution time : 0.022 s
Press any key to continue.
0 голосов
/ 10 июля 2020

В примере 2 вы извлекаете uint8_t, 8 бит, поэтому один char из строки, 5.

В примере 3 то же самое, вы извлекаете первый символ, поэтому w.

В последнем примере он печатает char (8 бит), 95 - это символ ASCII -. Если вы хотите показать число, cast значение int.

value4 = (uint8_t)value1;
cout << (int)value4 << endl;
...