c++ 编解码问题

pcww981p  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(144)

下面的代码通过存储序列的差异将long的向量编码为字符串时遇到了一个问题。
只要该值等于或小于2^30,编码/解码就可以正常工作。任何大于该值的值,逻辑都失败。注意,sizeof(long)是8字节。

static std::string encode(const std::vector<long>& path) {
    long lastValue = 0L;
    std::stringstream result;

    for (long value : path) {
        long delta = value - lastValue;
        lastValue = value;

        long var = 0;

        // Shift the delta value left by 1 bit and encode each 5-bit chunk into a character
        for (var = delta < 0 ? ~(delta << 1) : delta << 1; var >= 32L; var >>= 5) {
            result << (char)((32L | var & 31L) + 63L);  //char is getting written to result stringstream
        }

        // Encode the last 5-bit chunk into a character
        result << (char)(var + 63L); // char is getting written to result stringstream
    }

    std::cout << std::endl;
    return result.str();
}
static std::unique_ptr<std::vector<long>> decode(const std::string& encoded) {
    auto  decoded = std::make_unique<std::vector<long>>();
    long last_val = 0;    
    int index = 0;

    while (index < encoded.length()) {
        int shift = 0;
        long current = 1;
        int c;

        do {
            c = encoded[index++] - 63 - 1;
            current += c << shift;
            shift += 5;
        } while (c >= 31);

        long v = ( (current & 1) == 0 ? current >> 1 : ~(current >> 1) );
        last_val += v;
        decoded->push_back(last_val);
    }

    return std::move(decoded);
}

有人能提供可能出错的见解吗?

sz81bmfz

sz81bmfz1#

在decode函数内部,需要声明c为“long”而不是“int”。

相关问题