【问题标题】:Why is reading uint8_t as hex not working as expected?为什么将 uint8_t 读取为十六进制不能按预期工作?
【发布时间】:2019-06-04 14:38:12
【问题描述】:

考虑这样的代码:

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream ss;
    ss << "a0 b1";

    uint8_t byte;
    ss >> std::hex >> byte;    

    std::cout << std::hex << byte << std::endl;

    return 0;
}

即使a0 适合十六进制的uint8_t,为什么这个输出a 而不是a0

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    因为uint8_t 也是(可能)unsigned char,当您从 C++ 流执行格式化提取时,special rules exist

    不幸的是this is just an alias, not a distinct type

    基本上它跳过了“词法转换为数字”这一步,因为它认为你想提取一个字符。角色'a'

    我想你会想读到unsigned int,然后根据需要缩小尺寸。

    如果您确实缩小到 uint8_t,那么您还必须将其提升回 much the same reason 的更大 int (lol),以触发序列化。

    (live demo)

    老实说,在处理流时我会避免使用小的固定宽度类型(除非您使用read()write() 进行未格式化的工作)。这个问题太容易忘记了。

    【讨论】:

    • 是的,代码看起来真的很愚蠢:)
    • @Brandon 一元加号运算符使uint8_t 操作数提升为int,成为表达式结果的类型。
    • 如果我没记错的话,C++ 流的基本类型是 char 而不是 unsigned char。这将如何影响结果?
    • @Bart 基本类型无关。 IOStreams 对charry 事物有特殊的重载。否则流式传输您的 'a' 'b' 'c' 等将无法正常工作。 (实际上它更像是对 non charry 的东西有特殊的重载;那是你的 intbool 等。但是你已经习惯了以至于忘记了 char、@ 987654343@ 等不要那样做。)
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2021-05-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多