TypeError: key: 预期的字节数或字节数组,但得到的是 ‘str’
TypeError: key: expected bytes or bytearray, but got ‘str’
当我们将字符串键传递给方法时,会出现 Python“TypeError: key: expected bytes or bytearray, but got ‘str’” hmac.new()
。
要解决该错误,请使用方法将字符串编码为字节对象,
encode()
或在字符串前加上b
.
下面是错误如何发生的示例。
主程序
import hmac import hashlib signature = hmac.new('my_secret_key', b'my_message', digestmod=hashlib.sha256).hexdigest() # ⛔️ TypeError: key: expected bytes or bytearray, but got 'str' print(signature)
我们传递给方法的第一个参数hmac.new
必须是表示密钥的字节或字节数组对象。
我们为导致错误的参数传递了一个字符串。
使用该encode()
方法将字符串转换为字节
您可以使用该encode()
方法将字符串编码为字节对象。
主程序
import hmac import hashlib signature = hmac.new('my_secret_key'.encode('utf-8'), b'my_message', digestmod=hashlib.sha256).hexdigest() # 👇️ dd12963782c45f4c46708bca6d53c9631d2bfbd53b0e086d76512b38cb8715be print(signature)
str.encode方法将字符串的编码版本作为字节对象返回。默认编码是
utf-8
.
该hmac
方法采用的第二个参数是msg
并且可以是支持的任何类型hashlib
(例如字节对象)。
为字符串字面量加上前缀b''
以进行字节转换
如果你有一个字符串文字而不是存储在变量中的字符串,你可以简单地为字符串添加前缀以b
将其转换为字节对象。
主程序
import hmac import hashlib signature = hmac.new(b'my_secret_key', b'my_message', digestmod=hashlib.sha256).hexdigest() # 👇️ dd12963782c45f4c46708bca6d53c9631d2bfbd53b0e086d76512b38cb8715be print(signature)
否则,您可以调用该encode()
方法将两个字符串编码为字节对象。
主程序
import hmac import hashlib signature = hmac.new('my_secret_key'.encode('utf-8'), 'my_message'.encode('utf-8'), digestmod=hashlib.sha256).hexdigest() # 👇️ dd12963782c45f4c46708bca6d53c9631d2bfbd53b0e086d76512b38cb8715be print(signature)
该方法采用的第三个参数hmac.new
是digestmod
– 要使用的 HMAC 对象的摘要构造函数。此参数是必需的。
检查变量存储的类型
如果不确定变量存储的类型,请使用内置type()
类。
主程序
my_bytes = 'hello'.encode('utf-8') print(type(my_bytes)) # 👉️ <class 'bytes'> print(isinstance(my_bytes, bytes)) # 👉️ True my_str = 'hello' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True
类型
类
返回对象的类型。
如果传入的对象是传入类的实例或子类,则isinstance函数返回
。True