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

Posted

技术标签:

【中文标题】如何在 Visual C++ 中将字节数组转换为十六进制字符串?【英文标题】:How to convert Byte Array to hex string in visual c++? 【发布时间】:2012-12-12 14:15:13 【问题描述】:

方法声明如下:

//some.h
void TDES_Decryption(BYTE *Data, BYTE *Key, BYTE *InitalVector, int Length);

我从下面的代码调用这个方法:

//some.c
extern "C" __declspec(dllexport) bool _cdecl OnDecryption(LPCTSTR stringKSN, LPCTSTR BDK)
    TDES_Decryption(m_Track1Buffer, m_cryptoKey, init_vector, len);
    return m_Track1Buffer;

m_Track1Buffer 的数据类型是BYTE m_Track1Buffer[1000]; 现在我想对上述方法进行一些更改,即想要返回 String in hex 而不是 Byte。我应该如何将此m_Track1buffer 转换为Hex string

【问题讨论】:

什么是hexagonal 字符串?你的意思是hex 字符串吗?请编辑和澄清。此外,提供输入和预期输出的示例总是有帮助的。 【参考方案1】:

正如您提到的 c++,这是一个答案。 Iomanip 用于将整数以十六进制形式存储到字符串流中。

#include <sstream>
#include <iomanip>

std::string hexStr(BYTE *data, int len)

     std::stringstream ss;
     ss << std::hex;

     for( int i(0) ; i < len; ++i )
         ss << std::setw(2) << std::setfill('0') << (int)data[i];

     return ss.str();

【讨论】:

您需要使用setfill('0') 填充“0”字符。 我还必须添加 std::setw 才能正常输出每个数字的 2 位数字。所以现在看起来像 ss &lt;&lt; std::hex &lt;&lt; std:.setfill ('0');ss&lt;&lt;std::setw(2)&lt;&lt;static_cast&lt;int&gt;(data[i]); 如果实施了 cmets,这个答案将是完美的。【参考方案2】:

此代码会将固定大小为 100 的字节数组转换为十六进制字符串:

BYTE array[100];
char hexstr[201];
int i;
for (i=0; i<ARRAY_SIZE(array); i++) 
    sprintf(hexstr+i*2, "%02x", array[i]);

hexstr[i*2] = 0;

【讨论】:

感谢您的回答,但我应该如何退货。我应该在这里返回什么变量? @AmitPal 返回类似std::string(hexstr)【参考方案3】:

这是一个更灵活的版本(使用大写字符?在字节之间插入空格?),可用于普通数组和各种标准容器:

#include <string>
#include <sstream>
#include <iomanip>

template<typename TInputIter>
std::string make_hex_string(TInputIter first, TInputIter last, bool use_uppercase = true, bool insert_spaces = false)

    std::ostringstream ss;
    ss << std::hex << std::setfill('0');
    if (use_uppercase)
        ss << std::uppercase;
    while (first != last)
    
        ss << std::setw(2) << static_cast<int>(*first++);
        if (insert_spaces && first != last)
            ss << " ";
    
    return ss.str();

示例用法(纯数组):

uint8_t byte_array[] =  0xDE, 0xAD, 0xC0, 0xDE, 0x00, 0xFF ;
auto from_array = make_hex_string(std::begin(byte_array), std::end(byte_array), true, true);
assert(from_array == "DE AD C0 DE 00 FF");

用法示例(std::vector):

// fill with values from the array above
std::vector<uint8_t> byte_vector(std::begin(byte_array), std::end(byte_array));
auto from_vector = make_hex_string(byte_vector.begin(), byte_vector.end(), false);
assert(from_vector == "deadc0de00ff");

【讨论】:

【参考方案4】:

在循环中使用stringstreamsprintf等函数根本不是C++。这对性能来说很糟糕,而且这类函数通常会被大量调用(除非你只是在日志中写一些东西)。

这是一种方法。 不鼓励直接写入 std::string 的缓冲区,因为特定的 std::string 实现可能会有不同的行为,然后这将不起作用,但我们避免使用这种方式复制整个缓冲区:

#include <iostream>
#include <string>
#include <vector>

std::string bytes_to_hex_string(const std::vector<uint8_t> &input)

  static const char characters[] = "0123456789ABCDEF";

  // Zeroes out the buffer unnecessarily, can't be avoided for std::string.
  std::string ret(input.size() * 2, 0);
  
  // Hack... Against the rules but avoids copying the whole buffer.
  auto buf = const_cast<char *>(ret.data());
  
  for (const auto &oneInputByte : input)
  
    *buf++ = characters[oneInputByte >> 4];
    *buf++ = characters[oneInputByte & 0x0F];
  
  return ret;


int main()

  std::vector<uint8_t> bytes =  34, 123, 252, 0, 11, 52 ;
  std::cout << "Bytes to hex string: " << bytes_to_hex_string(bytes) << std::endl;

【讨论】:

这比预期的解决方案要好得多。您还可以删除向量类型输入并改用指针数组。这将使它变得更小(需要几个库)【参考方案5】:

像这样使用 boost 库怎么样(sn-p 取自 http://theboostcpplibraries.com/boost.algorithm ):

#include <boost/algorithm/hex.hpp>
#include <vector>
#include <string>
#include <iterator>
#include <iostream>

using namespace boost::algorithm;

int main()

  std::vector<char> v'C', '+', '+';
  hex(v, std::ostream_iterator<char>std::cout, "");
  std::cout << '\n';

  std::string s = "C++";
  std::cout << hex(s) << '\n';

  std::vector<char> w'4', '3', '2', 'b', '2', 'b';
  unhex(w, std::ostream_iterator<char>std::cout, "");
  std::cout << '\n';

  std::string t = "432b2b";
  std::cout << unhex(t) << '\n';

【讨论】:

我不确定你是否因为 Boost 而被否决,但我认为你的回答是可以接受的,不应该有负分。 对于 Qt 替代品:***.com/questions/36603001/…

以上是关于如何在 Visual C++ 中将字节数组转换为十六进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在c ++中将int数组转换为字节数组[重复]

如何在c ++中将数组字节转换为字符串?

如何在C ++中将字节数组中的整数转换为数字

如何在C#中将IntPtr转换为字节数组?

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

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?