繁体   English   中英

将 std::array 字节转换为十六进制 std::string

[英]convert std::array of bytes to hex std::string

我想要一种方法来获取任意大小的字节数组并返回一个十六进制字符串。 专门用于记录通过网络发送的数据包,但我使用了大量采用 std::vector 的等效函数。 像这样的东西,可能是模板?

std::string hex_str(const std::array<uint8_t, ??? > array);

我已经搜索过,但解决方案都说“将其视为 C 风格的数组”,我特别问是否有办法不这样做。 我认为这不是在每个 C++ FAQ 中的原因是这是不可能的,如果是的话,有人可以概述原因吗?

我已经有了这些重载,第二个可以通过衰减为 C 样式数组来用于 std::array,所以请不要告诉我怎么做。

std::string hex_str(const std::vector<uint8_t> &data);
std::string hex_str(const uint8_t *data, const size_t size);

(编辑:vector 是我代码中的参考)

如果您在编译时知道std::array的大小,则可以使用非类型模板参数。

template<std::size_t N>
std::string hex_str( const std::array<std::uint8_t, N>& buffer )
{ /* Implementation */ }

int main( )
{   
    // Usage.
    std::array<std::uint8_t, 5> bytes = { 1, 2, 3, 4, 5 };
    const auto value{ hex_str( bytes ) };
}

或者,您可以仅对整个容器进行模板化(减少过载)。

template<typename Container>
std::string hex_str( const Container& buffer ) 
{ /* Implementaion */ }

int main( )
{   
    // Usage.
    std::array<std::uint8_t, 5> bytes = { 1, 2, 3, 4, 5 };
    const auto value{ hex_str( bytes ) };
}

您应该考虑编写函数以使用迭代器,就像标准算法一样。 然后你可以将它与std::vectorstd::array输入一起使用,例如:

template<typename Iter>
std::string hex_str(Iter begin, Iter end)
{
    std::ostringstream output;
    output << std::hex << std::setw(2) << std::setfill('0');
    while(begin != end)
        output << static_cast<unsigned>(*begin++);
    return output.str();
}

在线演示

如果你真的想避免在你传入的任何容器上调用begin() / end() ,你可以定义一个助手来为你处理,例如:

template<typename C>
std::string hex_str(const C &data) {
    return hex_str(data.begin(), data.end());
}

在线演示

或者,如果您真的想要,您可以将其全部压缩为一个函数,例如:

template <typename C>
std::string hex_str(const C& data)
{
    std::ostringstream output;
    output << std::hex << std::setw(2) << std::setfill('0');
    for(const auto &elem : data)
        output << static_cast<unsigned>(elem);
    return output.str();
}

在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM