如何将 ostringstream 十六进制字符串字符对转换为单个 unit8_t 等效二进制值

how to convert an ostringstream hex string character pairs to a single unit8_t equivalent binary value

我正在尝试执行以下操作:

我有一个组装的 ostringstream 对象,其中包含要传输的十六进制有效负载。说吧,可能是

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

这个字符串代表 11 个字节,所以例如要传输的最后一个字节是 0xaf(两个字符给我 8 位实际数据)。

我希望读取每对字符,例如字符串中的 '03' 字符对,并将其转换为 uint8_t 元素,我将其推入 uint8_t 的向量元素。本质上,我将根据字符串的内容创建一个包含 uint8_t 个元素的新矢量,然后传输该矢量。

我下面的测试程序在 'int' 上工作正常,但没有给我想要的 uint8_t。是否有任何人都可以建议的优雅 and/or 直接方法来完成我想做的事情?

(注意:示例 3 是为了查看如果使用非十六进制合法值会发生什么。在示例 1 中,像 34r0 这样的值会将 34(hex) 转换为等效的 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 中,您正在提取一个 uint8_t,8 位,因此从字符串 5.

中提取一个 char

与示例 3 相同,您提取第一个字符,因此 w.

对于最后一个例子,它打印了一个char(8位),95是ASCII -字符。如果要显示数字,cast的值改为int

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

感谢曼努埃尔的回答。这是解决问题的一种方法。我仍然想知道是否有更优雅的方法来做到这一点。

#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.