gpt4 book ai didi

Python:将字节与字符串连接

转载 作者:太空狗 更新时间:2023-10-29 20:23:25 25 4
gpt4 key购买 nike

我正在开发一个 2.6 版本的 python 项目,该项目 future 还会支持正在使用的 python 3。具体来说,我正在开发一个 digest-md5 算法。

在 python 2.6 中不运行这个导入:

from __future__ import unicode_literals

我可以写一段这样的代码:

a1 = hashlib.md5("%s:%s:%s" % (self.username, self.domain, self.password)).digest() 
a1 = "%s:%s:%s" %(a1, challenge["nonce"], cnonce )

没有任何问题,我的身份验证工作正常。当我尝试导入 unicode_literals 的同一行代码时,出现异常:

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 中的字节 0xa8:意外代码字节

现在我是 python 的新手,所以我在解决这个问题上有点卡住了。如果我将格式字符串中的 %s 替换为 %r,我可以连接字符串,但身份验证不起作用。我读过的 digest-md5 规范说 16 个八位字节的二进制摘要必须附加到这些其他字符串。

有什么想法吗?

最佳答案

您观察到的行为的原因是 from __future__ import unicode_literals 切换了 Python 处理字符串的方式:

  • 在 2.x 系列中,没有 u 前缀的字符串被视为字节序列,每个字节可能在\x00-\xff(含)范围内。带有 u 前缀的字符串是 ucs-2 编码的 unicode 序列。
  • 在 Python 3.x 以及 unicode_literals future ,没有 u 前缀的字符串是用 UCS-2 或 UCS-4 编码的 unicode 字符串(取决于编译 Python 时使用的编译器标志)。带有 b 前缀的字符串是数据类型 bytes 的文字,与 3.x 之前的非 unicode 字符串非常相似。

在任一版本的 Python 中,字节字符串和 unicode 字符串都必须进行转换。默认执行的转换取决于您系统的默认字符集;在您的情况下,这是 UTF-8。如果不设置任何内容,它应该是 ascii,它拒绝\x7f 以上的所有字符。

hashlib.md5(...).digest() 返回的消息摘要是一个字节串,我想您希望整个操作的结果也是一个字节串。如果需要,将 nonce 和 cnonce 字符串转换为字节字符串。:

a1 = hashlib.md5("%s:%s:%s"  % (self.username, self.domain, self.password)).digest()
# note that UTF-8 may not be the encoding required by your counterpart, please check
a1 = b"%s:%s:%s" %(a1, challenge["nonce"].encode("UTF-8"), cnonce.encode("UTF-8") )

或者,您可以将调用 digest() 的字节字符串转换为 unicode 字符串(不推荐)。由于 UCS-2 的低 8 位相当于 ISO-8859-1,这可能会满足您的需求:

a1 = hashlib.md5("%s:%s:%s"  % (self.username, self.domain, self.password)).digest()
a1 = "%s:%s:%s" %(a1.decode("ISO-8859-1"), challenge["nonce"], cnonce)

关于Python:将字节与字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3157529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com