2013-05-14 25 views
1

我使用ostream來序列化一個對象,但write()方法似乎將額外的字節寫入緩衝區。ostream.write將額外的字節寫入緩衝區

uint32_t id1=0x01; 
uint32_t id2=0xdeadbeef; 
std::stringstream sink; 
sink.write(reinterpret_cast<char *>(&id1),sizeof(uint32_t)); 
print(sink); //01000000 - Correct 
sink.write(reinterpret_cast<char *>(&id2),sizeof(uint32_t)); 
print(sink); //FFFFFFEFFFFFFFBEFFFFFFADFFFFFFDE - why?! 

//print defined as follows: 
static void print(std::ostream &sink){ 
    std::stringstream sk; 
    sk << sink.rdbuf(); 
    std::string ss=sk.str(); 
    for(unsigned int i=0;i<ss.length();i++){ 
     printf("%02X", ss.c_str()[i]); 
    } 
} 

我很困惑爲什麼那些FFFF被寫入緩衝區。

+0

我[還沒有](http://ideone.com/IqeGbP)重現這一點。什麼類型的「匯」?你在做什麼系統? –

回答

3

即使ss.c_str()[i]char型,printf促進它的參數輸入int,所以多餘的FFFFFF從推廣鍵入int。嘗試使用"%02hhX"來代替告訴printf將它們轉換爲unsigned char s。

另一種解決方案是ss.c_str()[i] & 0xFF將其屏蔽掉。此外,請注意ss.c_str()[i]可以簡化爲ss[i]

代碼中發生的事情被稱爲sign extension

+0

非常感謝。我一直在調試'ostream'幾個小時。沒有意識到'printf'的問題。 :-( –