2013-08-07 42 views
0

這裏是我的方法:做一個字符串的0和1爲一個int,到與ASCII字符VAL

static void undo_bitstring(std::string& str) { 
    for (unsigned i = 0; i < str.length(); i += charbits) { 
     int ascii_val = 0; 
     for (unsigned j = 0; j < charbits; j++) { 
      if (str[i+j] == '1') ascii_val += (int)exp2(charbits-j-1); 
     } 
     str[i/charbits] = (char)ascii_val; 
    } 
    str.erase(str.begin()+str.size()/charbits,str.end()); 
} 

哪裏,只要你知道,

charbits 

定義
static const size_t charbits = 8 * sizeof(char); 

什麼是應該發生的,例如,

std::string str = "01010111"; 
undo_bitsring(str); 

應該改變海峽到

"W" 

因爲

0x2^7 + 1x2^6 + 0x2^5 + 1x2^4 + 0x2^3 + 1x2^2 + 1x2^1 + 1x2^0 
= 64 + 16 + 4 + 2 + 1 
= 87 

(int)'W' = 87 

當然這過程應該爲0的任何字符串和1層的與工作長度是charbit的倍數。例如,

std::string str = "010101110101011101010111"; 
undo_bitsring(str); 

應該改變海峽到

"WWW" 

在我已經運行,輸出只是看起來像一堆的,裏面還問號箱測試,表明某種錯誤。

任何想法?

我完全在這個錯誤的第一個地方呢?這是我試圖製作的一些加密/解密算法的一部分。

+2

閱讀關於'std :: bitset'。 –

+1

當我在gcc上編譯並運行它時,它爲我工作。 ''W「'和'」WWW「'示例都有效。 – SirGuy

+0

您的代碼正常工作。檢查你是否在使用你發佈的代碼。還要注意,按照C++標準,8 * sizeof(char)是冗餘的。 sizeof(char)'被標準要求爲'1'。 – DUman

回答

1

您知道有關>><<運營商。這些運算符應用於int時,會右移或左移第1位。它可能比使用更可靠(int)exp2(charbits-j-1);

+0

'exp2'是一個標準功能''因爲C++ 11,所以我真的懷疑使用'<<'是更可靠的,可能會導致編譯器發出完全相同的代碼。 – SirGuy

相關問題