2015-12-22 1 views
0

У меня есть массив байтов, который содержит шестнадцатеричное значение. Чтобы сохранить его, я кодирую его в строку, и для его получения сначала я декодирую его на строку, как я могу преобразовать его в массив байтов?Как преобразовать строку в массив байтов

Вот код:

Я создаю массив байтов здесь:

AutoSeededRandomPool prng; 
byte key[CryptoPP::AES::MAX_KEYLENGTH]; 

prng.GenerateBlock(key, sizeof(key)); 

, а затем кодировать его в виде строки со следующими:

string encoded; 
encoded.clear(); 
StringSource(key, sizeof(key), true, 
    new HexEncoder(
     new StringSink(encoded) 
    ) // HexEncoder 
); // StringSource 

Теперь, чтобы получить основной массив байтов, первый Я его расшифровываю:

string decodedkey; 
StringSource ssk(encoded, true /*pumpAll*/, 
new HexDecoder(
    new StringSink(decodedkey) 
    ) // HexDecoder 
); // StringSource 

, но я не знаю, как добраться до байтового массива.

byte key[CryptoPP::AES::MAX_KEYLENGTH]; 

ответ

0

Я думаю, что это будет работать лучше для вас для кодирования. Предполагается, что byte является typedef для unsigned char.

std::stringstream ss; 
ss.fill('0'); 
ss.width(2); 

for (int x = 0; x < CryptoPP::AES::MAX_KEYLENGTH; x++) 
{ 
    unsigned int val = (unsigned int)bytes[x]; 
    ss << std::hex << val; // writes val out as a 2-digit hex char 
} 

std::string result = ss.str(); // result is a hex string of your byte array 

выше будет преобразовать массив байтов, таких как {1,99,200} в "0163C8"

Затем, чтобы декодировать строку обратно в массив байтов:

byte key[MAX_KEYLENGTH] = {}; 
for (int x = 0; x < MAX_KEYLENGTH; x++) 
{ 
    char sz[3]; 
    sz[0] = result[x*2]; 
    sz[1] = result[x*2+1]; 
    sz[2] = '\0'; 
    unsigned char val = (unsigned char)strtoul(sz, NULL, 10); 
    bytes[x] = val; 
}