2011-10-03 29 views
26

如果我有過一個緩衝:獲得一個緩衝成十六進制表示的字符串流:

uint8_t buffer[32]; 

,它充滿了完全的價值觀,我怎麼能拿它變成一個字符串流,以十六進制表示,與0填充小值?

我想:

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

但是當我把串出的stringstream的,我有一個問題:用值< 16字節只需要一個字符來表示,我想他們是0填充。

例如,如果陣列中的字節1和2分別爲{32} {4}我的字符串流將有:

204 instead of 2004 

可否申請格式到字符串流以某種方式添加填充0?我知道我可以用sprintf來做到這一點,但是這些流已經被用於大量的信息,並且以某種方式實現這一點會有很大的幫助。

+2

爲什麼你把「正確」放入標題?你有沒有想過,否則你只會得到一個正確的答案?標題應該是有衝擊力和有意義的...... –

+2

在那裏,我爲你殺了這個詞:p –

回答

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

只有'setw'需要爲每個值完成;其他人很粘。 –

+0

糟糕:忘記了您需要將字節轉換爲int以使其正常工作。 –

+0

@AlanStokes謝謝,根據你的建議進行編輯。 –

6

看流修飾符:std::setwstd::fill

+0

+1因爲這是第一個答案,並且表示類似的東西:) –

+0

快速更正,我相信Thomas意味着'std :: setfill'。 –

相關問題