diff --git a/base64.vp b/base64.vp index eb39e33..3123266 100644 --- a/base64.vp +++ b/base64.vp @@ -56,11 +56,13 @@ def b64decode(s: str, out: uint8*) -> sizet: val = 0 # Parse 6-bit values sequentially c = s[i] - 43 - val |= (b64_dec_tab[c] & 0x3F) << 18 + # 整数提升取消后,`& 0x3F` 的无损常量适配会把左操作数留成 i8(位宽仅 8),<< 18 / << 12 越界报错; + # 显式 uint32() 把左操作数加宽到 32 位后再移位(与上方编码段 uint32(...) << 16 的先例一致)。 + val |= uint32(b64_dec_tab[c] & 0x3F) << 18 c = s[i+1] - 43 - val |= (b64_dec_tab[c] & 0x3F) << 12 + val |= uint32(b64_dec_tab[c] & 0x3F) << 12 c = s[i+2] - 43 - if s[i+2] != '=': val |= (b64_dec_tab[c] & 0x3F) << 6 + if s[i+2] != '=': val |= uint32(b64_dec_tab[c] & 0x3F) << 6 # 同上:i8 左操作数左移 6 位会截断高位(静默回绕) c = s[i+3] - 43 if s[i+3] != '=': val |= (b64_dec_tab[c] & 0x3F) # Write recovered bytes