关于 python3 中 chr(183)和 PHP 中的 chr(183)分别进行 base64 编码后为什么结果不一样

2019-07-19 14:44:14 +08:00
 0clickjacking0

关于 python3 中 chr(183)和 php 中的 chr(183)分别进行 base64 编码后为什么结果不一样,我个人猜测可能是因为 python3 中的字符串不能直接进行 base64 编码,需要转换成 bytes 类型后才可以,可能是转换时候出现了问题,想问各位 v 友知道是什么情况吗

# -*- coding: utf-8 -*-
import base64
a = chr(183)
print(a)
print(base64.b64encode(bytes(a,encoding='utf-8')))
# 输出结果 b'wrc='
<?php
var_dump(base64_encode(chr(183)));
//输出结果 string(4) "tw=="
2229 次点击
所在节点    Python
7 条回复
lcdtyph
2019-07-19 14:50:12 +08:00
因为你 py 的代码先 encode 了一次,导致 b7 前面加上了一字节的 utf8 前缀
0clickjacking0
2019-07-19 14:53:00 +08:00
@lcdtyph 那请问该如何避免这种情况
lcdtyph
2019-07-19 15:10:25 +08:00
@0clickjacking0 #2

base64.b64encode(bytes([183]))
0clickjacking0
2019-07-19 15:26:33 +08:00
@lcdtyph 问题是我这里 183 的结果是(ord('y') + 10) ^ ord('4')得出的,而且不止这一个,我要做的是把`system`这个字符串的每一位字母取出+10,也就是平移 10 个单位,然后`system`的每一位与 key = 'a4b0a0'的每一位异或后得到的值进行 base64 编码
kimchan
2019-07-19 15:39:50 +08:00
base64.b64encode(bytes(a,encoding='latin-1'))
kimchan
2019-07-19 15:42:24 +08:00
是由于两边编码不一致的原因引起的. 你在 php 那边. 先对 chr(183)进行 utf8_encode 一下的话. 在 base64 编码后的就是 b'wrc=' (猜想的, 未验证)
0clickjacking0
2019-07-19 15:52:10 +08:00
@kimchan 确实是这样的,感谢老哥,我已经解决了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/584420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX