Skip to main content
 首页 » 编程设计

python之使用 base64 编码,为什么我得到错误的答案

2025年05月04日21JeffreyZhao

我正在尝试对 websocket 进行身份验证。 在文档的示例中,如果我的客户随机数是:

nonce = 0xf08c98caf1fd82e8cea9825dbff04fd0  

然后我应该使用 base64 对其进行编码以获得:

target = "8IyYyvH9gujOqYJdv/BP0A==". 

我不确定我做错了什么,但我得到以下信息:

client_nonce = 0xf08c98caf1fd82e8cea9825dbff04fd0 
str_client_nonce = str(client_nonce)  
encoded = b64encode(bytes(str_client_nonce, 'utf-8')) 
print(encoded) 
 
>> b'MzE5NzQ0NzM5NTUzODE1NjMyMTAxNjk0MjM1NzExODU0NjI4ODE2' 

请您参考如下方法:

对于初学者来说,0xf08c98caf1fd82e8cea9825dbff04fd0 是 Python 中的一个数字(例如 0x10 是 16 的另一种写法)。但是数字并不是您实际拥有的数字,您拥有的是字节列表的十六进制表示形式,也称为十六进制字符串。

要做的事情:

  • 摆脱0x,使用字符串。
  • 将该字符串解码为字节。
  • 将这些字节编码为 base64。

代码:

import base64 
 
nonce_hex = 'f08c98caf1fd82e8cea9825dbff04fd0' 
nonce = bytearray.fromhex(nonce_hex) 
base64_nonce = base64.encodebytes(nonce) 
 
# -> b'8IyYyvH9gujOqYJdv/BP0A==\n' 

实际 nonce 总是字节。不同的方法被用来表示/存储/传输这些字节。使用十六进制字符串是一种常见的方式。使用 base64 是另一回事。十六进制字符串和 base64 都用于相同的目的:以字符串形式存储任意字节以便于处理。 Base64 碰巧比十六进制字符串需要更少的空间,这就是它通常是首选的原因。上面的代码只是将字节的一种字符串表示形式转换为另一种。