web-dev-qa-db-fra.com

Obtenir un tampon dans un flux de chaînes en représentation hexadécimale:

Si j'avais un tampon comme:

uint8_t buffer[32];

et il était complètement rempli de valeurs, comment pourrais-je le mettre dans un flux de chaînes, en représentation hexadécimale, avec 0-padding sur les petites valeurs?

J'ai essayé:

std::stringstream ss;
for (int i = 0; i < 32; ++i)
{
    ss << std::hex << buffer[i];
}

mais lorsque je retire la chaîne du flux de chaînes, j'ai un problème: les octets avec des valeurs <16 ne prennent qu'un seul caractère à représenter, et je voudrais qu'ils soient remplis 0.

Par exemple, si les octets 1 et 2 du tableau étaient {32} {4}, mon flux de chaînes aurait:

204 instead of 2004

Puis-je appliquer une mise en forme au flux de chaînes pour ajouter le 0-padding d'une manière ou d'une autre? Je sais que je peux le faire avec sprintf, mais les flux sont déjà utilisés pour beaucoup d'informations et ce serait d'une grande aide pour y parvenir d'une manière ou d'une autre.

30
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (int i = 0; i < 32; ++i)
{
    ss << std::setw(2) << static_cast<unsigned>(buffer[i]);
}
44
Dean Povey

Regardez les modificateurs de flux: std::setw et std::fill.

6
Thomas Matthews