鸿蒙ArkTs/c++/RepalcePioneer/base64.us之Base64编码解码的是非

狗血现象:

同一字符串原文使用

1、RepalcePioneer(一款Windows平台的字符串工具)

2、鸿蒙ArkTs自带base64编码方法

3、https://base64.us(一款在线base64工具)

来编码,得到编码串不一样,后二者是一致的。(未测试用c++写的base64编码。)

猜测base64编码可能有不同的“标准”?

相比解码的狗血度,上边的编码现象还不算什么:

上述1,和2或3,得到的两个不同的编码串,使用base64.us解码,居然得到相同的正确原文。

使用c++的base64解码(网上的一段代码,如下)上述不同的编码,也能得到相同的正确原文。

也就是说这两个方法在解码时,能正确处理不同编码工具(“标准”?)得到的不同编码串。

而用ArkTs的自带的解码方法,则可能得到不同的原文。

注意,上边说的是可能,即ArkTs有时能正确解码RepalcePioneer编码,有时不能。这是最狗血的地方。一个经验是:原文最后有一个单独的换行,其后可能有一些字符或没有,则ArkTs解码结果是:从这个换行起所有内容丢失。如果不是这样,则解码正确。

std::string base64_decode(const std::string &encoded) {
    static const std::string base64_chars =
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";
 
    std::string ret;
    int val = 0, valb = -8;
    for (unsigned char c : encoded) {
        if (base64_chars.find(c) == std::string::npos) break; // 非法字符
        val = (val << 6) + base64_chars.find(c);
        valb += 6;
        if (valb >= 0) {
            ret.push_back(char((val >> valb) & 0xFF));
            valb -= 8;
        }
    }
    return ret;
}

不了解为何存在不同的base64编码“标准”,以至于得到的编码串都大不相同。

更不理解为何这种不同的编码串,cpp解码或base64.us解码,能得到相同的正确原文。

我的实践是在鸿蒙NDK侧读取被ReplacePioneer编码的文件内容,然后在ArkTs侧解码,发现上述有时正确、有时错误(内容缺失)的现象。所以被迫在NDK侧用上述cpp方法解码,过渡一下,再把解码后的原文传回ArkTs侧,ArkTs侧不再参与base64解码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值