给定 std::hex、uint8_t 与 int 的 strringstream 中的不同行为
Different behaviors in strringstream given std::hex, uint8_t vs int
我想 uint8_t 实际上只是 char 的别名这一事实意味着当字符串流中的字符被读回时,它们是本地存储的,即字符的 ascii 代码,而如果char 被输入到一个 int,指定了 std::hex,它被读入为转换为基数 10 的十六进制数字。
这是一个展示行为的小例子,但我问的原因是因为我开始时假设指定 unit8_t 的输出向量是正确的方法,因为我稍后需要这样做将该向量作为一个数组作为字节向量提供给 C 函数(您将它作为一个空指针传入,它会以某种方式计算出如何处理它)。所以我认为将成对的输入字符读入字符串流,然后读入 uint8_t 将帮助我跳过手动位移。有没有办法保持读入 uint8_t 的想法但唤起对 int 的处理?我可以在从 stringstream 读取时转换为 int 吗?或者什么?
#include <iostream>
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <cstdint>
int main (int argc, char** argv) {
uint8_t n = 0;
std::stringstream ss;
ss << 'F';
ss >> std::hex >> n;
std::cout << "uint8:" << (int)n << std::endl;
int m = 0;
std::stringstream tt;
tt << 'F';
tt >> std::hex >> m;
std::cout << "int:" << std::hex << m << std::endl;
return 0;
}
输出
uint8:70
int:f
char
、signed char
和 unsigned char
有 operator>>
个重载,它们都从流中读取单个字符。 uint8_t
参数选择 unsigned char
重载作为最佳匹配,读取 F
作为字符(ASCII 代码 70 或 0x46)。
要匹配整数提取 operator>>
重载,请使用 short
或更大类型的参数(例如,uint16_t
):
uint16_t n = 0;
std::stringstream ss;
ss << 'F';
ss >> std::hex >> n;
Can I cast to int at the point of the read from the stringstream?
没有。参数通过引用获取,在函数调用中用作指针。类型双关 uint8_t
参数为 (int&)
将调用未定义的行为。只需使用更大的类型即可。
我想 uint8_t 实际上只是 char 的别名这一事实意味着当字符串流中的字符被读回时,它们是本地存储的,即字符的 ascii 代码,而如果char 被输入到一个 int,指定了 std::hex,它被读入为转换为基数 10 的十六进制数字。
这是一个展示行为的小例子,但我问的原因是因为我开始时假设指定 unit8_t 的输出向量是正确的方法,因为我稍后需要这样做将该向量作为一个数组作为字节向量提供给 C 函数(您将它作为一个空指针传入,它会以某种方式计算出如何处理它)。所以我认为将成对的输入字符读入字符串流,然后读入 uint8_t 将帮助我跳过手动位移。有没有办法保持读入 uint8_t 的想法但唤起对 int 的处理?我可以在从 stringstream 读取时转换为 int 吗?或者什么?
#include <iostream>
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <cstdint>
int main (int argc, char** argv) {
uint8_t n = 0;
std::stringstream ss;
ss << 'F';
ss >> std::hex >> n;
std::cout << "uint8:" << (int)n << std::endl;
int m = 0;
std::stringstream tt;
tt << 'F';
tt >> std::hex >> m;
std::cout << "int:" << std::hex << m << std::endl;
return 0;
}
输出
uint8:70
int:f
char
、signed char
和 unsigned char
有 operator>>
个重载,它们都从流中读取单个字符。 uint8_t
参数选择 unsigned char
重载作为最佳匹配,读取 F
作为字符(ASCII 代码 70 或 0x46)。
要匹配整数提取 operator>>
重载,请使用 short
或更大类型的参数(例如,uint16_t
):
uint16_t n = 0;
std::stringstream ss;
ss << 'F';
ss >> std::hex >> n;
Can I cast to int at the point of the read from the stringstream?
没有。参数通过引用获取,在函数调用中用作指针。类型双关 uint8_t
参数为 (int&)
将调用未定义的行为。只需使用更大的类型即可。