2016-11-29 60 views
2

我正在處理std::bitset<16>向量中的數據,它們都必須使用自制函數將字符串轉換爲和從無符號long(通過std::bitset::to_ulong())轉換爲字符串和從字符串轉換爲字符串(確切的算法是這個問題是無關的)爲什麼不相同的位集合轉換爲相同的ulong

bitset向量和字符串之間的轉換首先看起來工作正常,因爲如果我第一次轉換bitset向量到字符串,然後回到bitset它是相同的;我已經通過使一個程序,它包括本證明:

for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<std::endl;//print bitsets before conversion 

bitset_to_string(my_bitset16vector,my_str); 
string_to_bitset(my_bitset16vector,my_str); 

std::cout<<std::endl 
for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<std::endl;//print bitsets after conversion 

輸出可能看起來有點像這樣(在這種情況下,只有4位集):

1011000011010000 
1001010000011011 
1110100001101111 
1001000011001111 

1011000011010000 
1001010000011011 
1110100001101111 
1001000011001111 

通過該判斷,之前的位集和轉換後顯然是相同的,但是儘管如此,當我告訴他們轉換爲無符號長整型時,位集轉換完全不同;在一個程序,它看起來是這樣的:

for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<".to_ulong()="<<B.to_ulong()<<std::endl;//print bitsets before conversation 

bitset_to_string(my_bitset16vector,my_str); 
string_to_bitset(my_bitset16vector,my_str); 

std::cout<<std::endl 
for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<".to_ulong()="<<B.to_ulong()<<std::endl;//print bitsets after conversion 

輸出可能看起來有點像這樣:

1011000011010000.to_ulong()=11841744 
1001010000011011.to_ulong()=1938459 
1110100001101111.to_ulong()=22472815 
1001000011001111.to_ulong()=18649295 

1011000011010000.to_ulong()=45264 
1001010000011011.to_ulong()=37915 
1110100001101111.to_ulong()=59503 
1001000011001111.to_ulong()=37071 

首先顯而易見的是,當所顯示的位集仍然超越一切合理懷疑是相同的二進制,但當轉換爲無符號long時,相同的位集返回完全不同的值(完全破壞我的程序)

爲什麼t他?即使它們打印的是一樣的,它可以是位集是不一致的嗎?錯誤是否存在於字符串轉換器的位集中,儘管位集是相同

編輯:並非包括我的對話在內的所有程序都有這個問題,它只發生在我創建後(從字符串)修改位集後,在我的情況下試圖加密位集,而這根本不能砍倒一些簡單和短期,但在我寫作的最大壓縮方式,它看起來是這樣的:

(那就是即使不包括公共密鑰結構和模塊化電源功能的確定指標)

int main(int argc, char**argv) 
{ 
    if (argc != 3) 
    { 
     std::cout<<"only 2 arguments allowed: plaintext user"<<std::endl; 
     return 1; 
    } 

    unsigned long k=123456789;//any huge number loaded from an external file 
    unsigned long m=123456789;//any huge number loaded from an external file 


    std::vector< std::bitset<16> > data;  
    std::string datastring=std::string(argv[1]); 

    string_to_bitset(data,datastring);//string_to_bitset and bitset_to_string also empties string and bitset vector, this is not the cause of the problem 

    for (std::bitset<16>& C : data) 
    { 
     C =std::bitset<16>(modpow(C.to_ulong(),k,m));//repeated squaring to solve C.to_ulong()^k%m 
    } 

    //and now the problem happens  


    for (std::bitset<16>& C : data) std::cout<<C<<".to_ulong()="<<C.to_ullong()<<std::endl; 

    std::cout<<std::endl; 

    bitset_to_string(data,datastring); 
    string_to_bitset(data,datastring); 
    //bitset_to_string(data,datastring); 

    for (std::bitset<16>& C : data) std::cout<<C<<".to_ulong()="<<C.to_ullong()<<std::endl; 

    std::cout<<std::endl; 
return 0; 
} 

我很清楚,你現在都在想我正在做模塊化功能錯誤(我guara但我所做的事情實際上並不重要,因爲我的問題不是:我的計劃有什麼問題;我的問題是:爲什麼不相同的位集(打印相同的二進制1和0)轉換爲相同的無符號長整型。

其他編輯:我還必須指出,無符號長整數的第一個printet值是「正確的」,因爲它們在使用時允許我完美地解密該位集,而之後打印的無符號長整型值是「錯誤的」它會產生完全錯誤的結果。

+0

請嘗試提取重複此問題的最小一段代碼(如展示此問題的小主文件)。我們不能看到如何將數據分配給位集的例子。 –

+2

你使用什麼編譯器? 「11841744」的值在低16位是正確的,但是在16位以上有一些額外的設置位。這可能是你的STL實現中的一個bug,其中to_long訪問超過它應該使用的16位。 – 1201ProgramAlarm

+0

原來你是對的@ 1201ProgramAlarm在我的情況下,16位是小到包含所有的數據,但我的編譯器無論如何都將所有數據添加到位集,從16位升級到32位解決了我的問題;如果你可以發表你的評論作爲答案,我會接受它 – Nikolaj

回答

1

「11841744」的值在低16位是正確的,但在16位以上有一些額外的設置位。這可能是你的STL實現中的一個bug,其中to_long訪問超過它應該使用的16位。

或者(從您上面的評論中),您將向bitset添加更多位,而不是它可以容納,並且您遇到未定義行爲。

相關問題