将字节数组转换为十六进制std :: string c ++时的空格

时间:2014-11-28 20:29:34

标签: c++ string encoding hex crypto++

我使用以下函数将字节数组(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

如何将字节数组转换为十六进制字符串,反之亦然,十六进制字符串中没有空格?

2 个答案:

答案 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,因此您可以解码编码的字符串。它的工作方式几乎相同。