如何在C++中将字节数组转换为十六进制字符串?

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

我正在寻找一种将任意长度的字节数组转换为十六进制字符串的最快方法。这个问题已经在 StackOverflow for C# 得到了完整的解答。一些 C++ 解决方案可以在here找到。 是否有针对问题的“交钥匙”或“现成”解决方案?欢迎使用 C 风格的解决方案。

c++ string hex byte
4个回答
19
投票
或者,如果您有一个支持统一初始化语法和基于范围的 
for

循环的编译器,您可以节省几行代码。


#include <vector> #include <sstream> #include <string> #include <iostream> #include <iomanip> int main() { std::vector<unsigned char> v { 1, 2, 3, 4 }; std::ostringstream ss; ss << std::hex << std::uppercase << std::setfill( '0' ); for( int c : v ) { ss << std::setw( 2 ) << c; } std::string result = ss.str(); std::cout << result << std::endl; }



8
投票

boost::算法::十六进制 std::vector<unsigned char> v{1, 2, 3, 4}; std::string res; boost::algorithm::hex(v, back_inserter(res));



2
投票

#include <iostream> #include <string> #include <array> #include <vector> #include <sstream> #include <iomanip> #include <algorithm> using namespace std; // use this macro for c++11 feature #define USE_CPP11 int main(int argc, char* argv[]) { array<unsigned char, 3> hexArr = {0x01, 0xff, 0x55}; const char separator = ' '; // separator between two numbers ostringstream os; os << hex << setfill('0'); // set the stream to hex with 0 fill #ifdef USE_CPP11 std::for_each(std::begin(hexArr), std::end(hexArr), [&os, &separator] (int i) { os << setw(2) << i << separator; }); #else // c++03 typedef array<unsigned char, 3>::const_iterator const_iterator; for (const_iterator it = hexArr.begin(); it != hexArr.end(); ++it) { os << setw(2) << int(*it) << separator; } #endif os << dec << setfill(' '); // reset the stream to "original" // print the string cout << "the string array is: " << os.str() << endl; return EXIT_SUCCESS; }



2
投票

template <size_t byteCount> string BytesArrayToHexString( const std::array<byte, byteCount>& src ) { static const char table[] = "0123456789ABCDEF"; std::array<char, 2 * byteCount + 1> dst; const byte* srcPtr = &src[0]; char* dstPtr = &dst[0]; for (auto count = byteCount; count > 0; --count) { unsigned char c = *srcPtr++; *dstPtr++ = table[c >> 4]; *dstPtr++ = table[c & 0x0f]; } *dstPtr = 0; return &dst[0]; }

一个好的编译器对此应用 SSE 优化应该没有任何问题......

© www.soinside.com 2019 - 2024. All rights reserved.