字符串视图<uint8_t>

问题描述 投票:0回答:1

我有一个很大的字节向量,我想取出其中的一部分,将这些字节解释为以十六进制系统编写的 ASCII 字符,并将该子字符串打印在屏幕上。我不需要副本,所以我想使用

std::basic_string_view<uint8_t>
。下面的代码将导致编译错误(“no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream'} and 'std::basic_string_view'"). What is the best way to print the substring without any copies?

(在下面的示例中,我不想在屏幕上显示“cde”)

#include <cstdint>
#include <iostream>
#include <string_view>
#include <vector>

int main() {
    std::vector<uint8_t> v { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 };
    std::basic_string_view<uint8_t> b { v.begin() + 2, v.begin() + 5 };
    std::cout << b << std::endl;

    return 0;
}
c++ hex cout uint8t string-view
1个回答
1
投票

std::cout
是一个
std::basic_ostream<char>
,这意味着仅定义了
std::string_view<char>
的流运算符的重载,请参阅 https://en.cppreference.com/w/cpp/string/basic_string_view/operator_ltlt

如果您想打印

std::basic_string_view
,您只需将其传递给具有相同字符类型的流,否则您必须使用自己的函数打印字符串。

如果您想创建

std::string_view
,您可以将
std::vector
的类型更改为
std::vector<char>
或在创建
char
时强制转换为
string_view

std::basic_string_view<char> sv{ reinterpret_cast<char*>(v.data()) + begin, end - begin };
std::cout << sv << std::endl;    
© www.soinside.com 2019 - 2024. All rights reserved.