Python中如何实现安卓Base64.encodeToString(bytes,11)等效功能
安卓Base64.encodeToString flag=11的含义与Python等价实现
flag参数值解析
安卓android.util.Base64的编码标志是位掩码,可通过按位或组合多个规则,各个公开常量的对应数值如下:
NO_PADDING = 1:省略编码结果末尾的=填充字符NO_WRAP = 2:编码结果不插入任何换行符(默认配置下每76个字符会插入一个换行符)CRLF = 4:换行时使用\r\n作为换行符(仅在配置自动换行时生效)URL_SAFE = 8:使用URL安全字符表,将标准Base64中的+替换为-、/替换为_
对数值11做拆解:11 = 1 + 2 + 8 = NO_PADDING | NO_WRAP | URL_SAFE,未包含CRLF标志,对应的编码规则为:
- 使用URL安全的Base64字符集,结果无
+// - 输出单行结果,不插入任何换行
- 省略末尾所有
=填充字符
Python等价实现
Python标准库base64模块的urlsafe_b64encode方法已经默认满足「URL安全字符集」「不插入换行」两个规则,只需要额外移除末尾的=填充即可与安卓flag=11的编码结果完全一致,实现代码如下:
import base64 def android_base64_encode_flag11(data: bytes) -> str: """等价于安卓Base64.encodeToString(data, 11)""" # 执行URL安全Base64编码,默认无换行、带=填充 encoded_bytes = base64.urlsafe_b64encode(data) # 移除末尾=填充,转字符串返回 return encoded_bytes.rstrip(b'=').decode("ascii")
一致性验证
通过多组输入对照可确认结果完全匹配:
- 输入字节
b"test":安卓编码结果为dGVzd,上述函数输出同样为dGVzd - 输入字节
b"\x00\x10\x83":安卓编码结果为ABC,上述函数输出同样为ABC - 输入字节
b"\xfb\xef\xbe":安卓编码结果为--_-,上述函数输出完全匹配
内容的提问来源于stack exchange,提问作者Andy_ye
相关产品推荐
相关产品推荐

