2011-10-03 17 views
26

Si tuviera un buffer como:Conseguir un búfer en un stringstream en representación hexadecimal:

uint8_t buffer[32]; 

y estaba lleno por completo con los valores, cómo podría conseguir en un stringstream, en representación hexadecimal, con 0-relleno en valores pequeños?

Traté:

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

pero cuando tomo la cadena fuera de la stringstream, tengo un problema: bytes con valores < 16 sólo tienen un carácter para representar, y me gustaría que fueran 0 acolchado.

Por ejemplo, si los bytes 1 y 2 en la matriz fueron {32} {4} mi stringstream tendría:

204 instead of 2004 

¿Puedo aplicar formato a la stringstream para añadir el 0-relleno de alguna manera? Sé que puedo hacer esto con sprintf, pero las transmisiones ya están siendo utilizadas para mucha información y sería de gran ayuda para lograr esto de alguna manera.

+2

¿Por qué pones "correctamente" en el título? ¿Pensaste lo contrario, solo obtendrías una respuesta correcta? Los títulos deben ser contundentes y significativos ... –

+2

Ahí, maté la palabra por ti: p –

Respuesta

41
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]); 
} 
+5

Solo se debe hacer el 'setw' para cada valor; los otros son pegajosos. –

+0

Vaya: olvidó que necesita convertir el byte en int para que funcione correctamente. –

+0

@AlanStokes gracias, editado según su sugerencia. –

6

Mire los modificadores de flujo: std::setw y std::fill.

+0

+1 ya que esta fue la primera respuesta y dijo cosas similares :) –

+0

Corrección rápida, creo que Thomas significaba 'std :: setfill'. –

Cuestiones relacionadas