如何将 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.
我正在尝试执行以下操作:
我有一个组装的 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.