我使用以下函数将字节数组(Crypto ++ key)转换为Hex String
std::string Hexa::byte_to_hex_encoder(unsigned char *array, int len){
std::stringstream ss;
for(int i=0;i<len;++i)
ss << std::hex << std::uppercase <<std::setw(2) <<(int)array[i];
return ss.str();
}
字节数组大小为16,当我不使用setw(2)
时,我得到一个十六进制字符串,字符较少,如30或有时31。当我使用setw(2)
时,我得到随机空格十六进制字符串如
5CA0 138C5487D2C6D929EC36B694890
如何将字节数组转换为十六进制字符串,反之亦然,十六进制字符串中没有空格?
答案 0 :(得分:3)
您还需要setfill('0')
才能正确填充数字。
如果没有setw
,像7这样的数字只会出现7
,就像你看到的那样使你的字符串缩短。使用setw
但没有setfill
时,它会填充到右侧长度,但带有空格。
添加setfill
可确保用零填充。
对于您的代码:
ss << std::hex
<< std::uppercase
<< std::setw(2)
<< std::setfill('0')
<< (int)array[i];
答案 1 :(得分:0)
由于你有Crypto ++标签,这里有两种方法可以在Crypto ++中完成。来自HexEncoder维基页面。
首先,使用Crypto ++ pipelines:
byte decoded[] = { 0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88,
0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 };
string encoded;
StringSource ss(decoded, sizeof(decoded), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << encoded << endl;
与前一个示例一样,运行会产生以下输出。
$ ./cryptopp-test.exe
FFEEDDCCBBAA99887766554433221100
第二,使用功能:
byte decoded[] = { 0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88,
0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 };
string encoded;
HexEncoder encoder;
encoder.Put(decoded, sizeof(decoded));
encoder.MessageEnd();
word64 size = encoder.MaxRetrievable();
if(size)
{
encoded.resize(size);
encoder.Get((byte*)encoded.data(), encoded.size());
}
cout << encoded << endl;
上述程序的运行产生以下输出。
$ ./cryptopp-test.exe
FFEEDDCCBBAA99887766554433221100
还有HexDecoder,因此您可以解码编码的字符串。它的工作方式几乎相同。