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

9
我正在寻找一种最快的方法将任意长度的字节数组转换为十六进制字符串。这个问题已经在StackOverflow上针对C#进行了全面回答,你可以点击这里查看。在C++中也有一些解决方案,你可以在这里找到。

是否有"即插即用"或"现成"的解决方案呢?我们欢迎使用C语言的解决方案。


你需要提供更多环境细节等信息,才能决定实现这个非常简单的需求的最快方式。输出字符串已经分配了吗?您有多少可用于查找表的内存空间?“任意长度”很困难,对于非常大的数组,可能可以并行运行两个或更多转换。您的要求是否如此严格,以至于不能只使用您链接到的解决方案之一? - Martin James
4个回答

19
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
#include <sstream>
#include <iomanip>

int main() 
{
  std::vector<unsigned char> v;

  v.push_back( 1 );
  v.push_back( 2 );
  v.push_back( 3 );
  v.push_back( 4 );

  std::ostringstream ss;

  ss << std::hex << std::uppercase << std::setfill( '0' );
  std::for_each( v.cbegin(), v.cend(), [&]( int c ) { ss << std::setw( 2 ) << c; } );

  std::string result = ss.str();

  std::cout << result << std::endl;
  return 0;
}

或者,如果您有一个支持统一初始化语法和基于范围的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;
}

7

使用boost::algorithm::hex

来进行操作。

std::vector<unsigned char> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
std::string res;
boost::algorithm::hex(v.begin(), v.end(), back_inserter(res));

2
你可以使用C++标准库,也可以使用boost::lexical_cast。
#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

我知道的C++11中最快的方法之一:

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优化...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接