如何在 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 << std::hex << std:.setfill ('0');
和 ss<<std::setw(2)<<static_cast<int>(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】:在循环中使用stringstream
、sprintf
等函数根本不是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++ 中将字节数组转换为十六进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章