From 40fd9d8cf79168200728c88944d80bdda9cb533d Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 13 Oct 2026 16:34:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(base64):=20=E5=9B=A0=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=95=B4=E6=95=B0=E6=8F=90=E5=8D=87=EF=BC=8Cb64decode=20?= =?UTF-8?q?=E7=A7=BB=E4=BD=8D=E5=B7=A6=E6=93=8D=E4=BD=9C=E6=95=B0=E6=98=BE?= =?UTF-8?q?=E5=BC=8F=E5=8A=A0=E5=AE=BD=E4=B8=BA=20uint32=EF=BC=88=E4=BF=AE?= =?UTF-8?q?=E7=A7=BB=E4=BD=8D=E8=AE=A1=E6=95=B0=E8=B6=8A=E7=95=8C=E4=B8=8E?= =?UTF-8?q?=E9=9D=99=E9=BB=98=E6=88=AA=E6=96=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base64.vp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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