TypeError: key: 预期的字节数或字节数组,但得到了 ‘str’

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.

typeerror key expected bytes or bytearray 但得到了 str

下面是错误如何发生的示例。

主程序
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.newdigestmod– 要使用的 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