2014-02-22 151 views
2

我正在寫一個算法來解碼base64。在靠近盡頭下面的代碼,如果我改變:奇怪的行爲與子字符串

Binary.substr((FirstChar - 1) >= 0 ? (I - 1) : 0); 

Binary.substr((I - 1) >= 0 ? (I - 1) : 0); 

它拋出std::out_of_range。不過,如果我不管它,它工作正常..

整個代碼如下:

#include <iostream> 
#include <bitset> 
#include <algorithm> 

static const std::string Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

std::string DecodeBase64(std::string Data) 
{ 
    std::string Binary = std::string(); 
    std::string Result = std::string(); 

    for (std::size_t I = Data.size(); I > 0; --I) 
    { 
     if (Data[I - 1] != '=') 
     { 
      std::string Characters = Data.substr(0, I); 
      for (auto it = Characters.begin(); it != Characters.end(); ++it) 
       Binary += std::bitset<6>(Base64Chars.find(*it)).to_string(); 
      break; 
     } 
    } 

    for (std::size_t I = 0; I < Binary.size(); I += 8) 
    { 
     int FirstChar = I; 
     std::string str = Binary.substr((FirstChar - 1) >= 0 ? (I - 1) : 0); 
     Result += static_cast<char>(std::bitset<8>(str).to_ulong()); 
     if (I == 0) ++I; 
    } 

    return Result; 
} 

int main() 
{ 
    std::cout<<DecodeBase64("aGVsbG8gdGhlcmUgbm9vYg=="); 
} 

這是奇怪,因爲我分配給IFirstChar之前,我稱之爲substr所以它應該是同樣的確切值..任何想法,爲什麼發生這種情況?

回答

6

這是因爲I的類型是std::size_t,它是無符號的。當I爲零時,​​被解釋爲非常大的正數。

轉換Iint恰好在分配解決了這個問題,因爲FirstChar現在簽署,所以FirstChar -1可能成爲負值。

轉換I-1 >= 0爲等效I >= 1應該可以解決這個問題:

Binary.substr(I >= 1 ? (I - 1) : 0); 
+0

OMG ..簽署對無符號=(謝謝你這的確修復它我現在得更加小心 – Brandon

+2

!。 @CantChooseUsernames Double facepalms是有史以來最好的學習時刻;)... –