c++ - 给定 std::hex、uint8_t 与 int 的 strringstream 中的不同行为
问题描述
我想 uint8_t 实际上只是 char 的别名,这意味着当字符串流中的字符被读回时,它们是本地存储的,即字符的 ascii 代码,而如果将 char 输入到 int,则std::hex 指定,它被读取为转换为基数 10 的十六进制数字。
这是一个展示这种行为的小例子,但我问的原因是因为我一开始就假设指定 unit8_t 的输出向量是正确的方法,因为我需要稍后将此向量作为数组提供给 C函数作为字节向量(您将其作为 void 指针传入,它会以某种方式计算出如何处理它)。所以我认为将输入字符对读入字符串流,然后读入 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
解决方案
和有operator>>
重载char
,它们都从流中读取单个字符。参数选择重载作为最佳匹配,读取为字符(ASCII 代码 70 或 0x46)。signed char
unsigned char
uint8_t
unsigned char
F
要匹配整数提取operator>>
重载,请使用类型short
或更大的参数(例如,uint16_t
):
uint16_t n = 0;
std::stringstream ss;
ss << 'F';
ss >> std::hex >> n;
我可以在从 stringstream 读取时转换为 int 吗?
不,参数是通过引用获取的,在函数调用中用作指针。键入双关语uint8_t
将(int&)
调用未定义的行为。只需使用更大的类型。
推荐阅读
- c# - 将现有项目移至新位置
- excel - 使用公共 VBA 函数更改 Excel 中的单元格颜色背景 - 不是 VBA 程序员
- mysql - MYSQL,为 date|datetime 插入创建了一个用户定义的函数,但它不起作用
- codenameone - BoxLayout.yLast() 中的填充物?
- javascript - Javascript 添加今天的天数、周数或月数
- gpu - 在 Google Colaboratory 中,有没有办法表明偏好或需要特定的 gpu 模型?
- python - 总是将数字向上取整
- javascript - 如何使用 JWT 验证 Html + Javascript 应用程序
- google-chrome - 使用 chromedp 加载现有的 Chrome 用户配置文件和数据
- docker - Heroku:找不到docker入口点