2011-10-03 17 views
26

Gdybym miał bufor jak:Pierwsze bufor do stringstream w reprezentacji hex:

uint8_t buffer[32]; 

i został wypełniony całkowicie z wartościami, jak mogę dostać go w stringstream w reprezentacji szesnastkowej, z 0-padding na małych wartościach?

Próbowałem:

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

ale kiedy biorę ciąg z stringstream, mam problem: bajty o wartościach < 16 ma tylko jeden znak do reprezentowania, a chciałbym je mieć 0 wyściełane.

Na przykład, jeżeli bajty 1 i 2 w tablicy były {32} {4} moja stringstream musiałaby:

204 instead of 2004 

Czy mogę zastosować formatowanie do stringstream dodać 0-dopełnienie jakoś? Wiem, że mogę to zrobić z sprintf, ale strumienie są już wykorzystywane do wielu informacji i byłoby to wielką pomocą, aby jakoś to osiągnąć.

+2

Dlaczego umieściłeś "poprawnie" w tytule? Czy uważasz, że w przeciwnym razie otrzymasz tylko właściwą odpowiedź? Tytuły powinny być zwięzłe i znaczące ... –

+2

Tam, zabiłem słowo dla ciebie: p –

Odpowiedz

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

Tylko 'setw' musi być wykonane dla każdej wartości; pozostałe są lepkie. –

+0

Ups: Zapomniałeś, że musisz odrzucić bajt do int, aby to działało poprawnie. –

+0

@AlanStokes dzięki, edytowane zgodnie z sugestią. –

6

Sprawdź modyfikatory strumienia: std::setw i std::fill.

+0

+1, ponieważ to była pierwsza odpowiedź i powiedział podobne rzeczy :) –

+0

Szybka korekta, Wierzę, że Thomas miał na myśli 'std :: setfill'. –