我正在编写一种算法来解码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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

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==");
}

这很奇怪,因为我在调用I之前就已将FirstChar分配给substr,因此它应该是相同的精确值。为什么会这样呢?

最佳答案

这是因为I的类型为std::size_t,它是未签名的。当I为零时,I - 1解释为非常大的正数。

I转换为分配中发生的int可以解决此问题,因为FirstChar现在已签名,因此FirstChar -1可能变为负数。

I-1 >= 0转换为等效的I >= 1应该可以解决此问题:

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

关于c++ - 带有子字符串的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21962299/

10-11 00:16