python3与python2编码导致 hmac.new/base64.b64encode('value') python3各种报错

python3编码的请查看这篇文章:https://www.cnblogs.com/575dsj/p/7112767.html

第一次:python3传的是bytes不能是str。好吧,认了。我就传bytes吧

b= hmac.new(‘/admindevice/GetCameraSetting‘,‘adbaskjclas‘,sha1).hexdigest()print(b)

--------------------------------------------------------------------------------------------

Traceback (most recent call last):
File "D:/py3_study/run_test/md_code.py", line 23, in <module>
b= hmac.new(‘/admindevice/GetCameraSetting‘,‘adbaskjclas‘,sha1).hexdigest()
File "F:\Python36\lib\hmac.py", line 144, in new
return HMAC(key, msg, digestmod)
File "F:\Python36\lib\hmac.py", line 42, in __init__
raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
TypeError: key: expected bytes or bytearray, but got ‘str‘

来到第二次:看报错,悲催了吧。hmac.new说必须是string才行;

因为hmac.new是要求utf-8的编码

b= hmac.new(bytes(‘/admindevice/GetCameraSetting‘),bytes(‘adbaskjclas‘),sha1).hexdigest()print(b)

----------------------------------------------------------------

Traceback (most recent call last):
File "D:/py3_study/run_test/md_code.py", line 23, in <module>
b= hmac.new(bytes(‘/admindevice/GetCameraSetting‘),bytes(‘adbaskjclas‘),sha1).hexdigest()
TypeError: string argument without an encoding

好吧,hamc.new的要求是UTF-8,我就来转UTF-8,终于成功了

b= hmac.new(bytes(‘/admindevice/GetCameraSetting‘,‘utf-8‘),bytes(‘adbaskjclas‘,‘utf-8‘),sha1).hexdigest()
print(b)
-------------结果:792a09ad139522fe77771bc5cb5fbb44b44b40b3

这种处理方式也可以,将所有都转成Unicode的方式

a= hmac.new(bytes(‘/admindevice/GetCameraSetting‘,‘latin-1‘), bytes(‘adbaskjclas‘,‘latin-1‘),sha1).hexdigest()print(a)-------------结果:792a09ad139522fe77771bc5cb5fbb44b44b40b3

base64.b64encode(‘value‘)也是相同问题,需要传bytes,然后再转回UTF-8,够恶心吧

原因:Python 2 悄悄掩盖掉了 byte 到 unicode 的转换,只要数据全部是 ASCII 的话,所有的转换都是正确的,一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效,从而造成 UnicodeDecodeError 的错误。py2编码让程序在处理 ASCII 的时候更加简单。你复出的代价就是在处理非 ASCII 的时候将会失败。

py3也有两种数据类型:str和bytes;  str类型存unicode数据,bytse类型存bytes数据

python3与python2编码导致 hmac.new/base64.b64encode('value') python3各种报错

原文地址:https://www.cnblogs.com/xiaoxiao-niao/p/8266768.html

时间: 2025-01-06 23:18:19

python3与python2编码导致 hmac.new/base64.b64encode('value') python3各种报错的相关文章

python3 UnicodeEncodeError错误,cx_oracle模块执行sql报错:UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position

问题描述: 写了一个执行sql的模块,引用了cx_oracle,在windows机器上完美运行,移植到Centos上就会报错, UnicodeEncodeError: 'ascii' codec can't encode characters in position 检查过程: 代码编码为utf-8,print编码为utf-8,文件编码为utf-8,服务器编码为utf-8,各种正常 定位代码报错位置,开始怀疑是sql执行成功,返回值有中文报错,但是后来通过观察,是传入sql,并没有执行成功,执行

python2和python3中的编码问题

开始拾起python,准备使用python3, 造轮子的过程中遇到了编码的问题,又看了一下python3和python2相比变化的部分. 首先说个概念: unicode:在本文中表示用4byte表示的unicode编码,也是python内部使用的字符串编码方式. utf-8:在本文中指最少1byte表示的unicode编码方式 我在使用 if isinstance(key,unicode): key= key.encode('utf-8') 的时候,发现key值被转成了b'foo',b'bar'

Python2 和 Python3 中默认编码的差异

最近在使用 Python3.4 做一些脚本实现,发现对于编码的处理上和 Python2.6 有很大的不同,就此机会把相关知识做个梳理,方便需要的时候查阅. 先说下概念和差异: 脚本字符编码:就是解释器解释脚本文件时使用的编码格式,可以通过 # -\*- coding: utf-8 -\*- 显式指定解释器字符编码:解释器内部逻辑过程中对 str 类型进行处理时使用的编码格式Python2 中默认把脚步文件使用 ASCII 来处理(历史原因请 Google)Python2 中字符串除了 str 还

191016 Linux中python2升级到python3导致yum命令报错

因为python2到python3的升级,导致使用yum相关的命令时报错: 报错一: command not found... 方案:修改/usr/bin/yum文件的第一行,将结尾的python改成python27(或python2.7),请自行尝试,修改后能查询yum版本即可: 报错二:cannot retrieve matalink for repository:epel/x86... 方案:sed -i ‘s#https://#http://#g' /etc/yum.repos.d/ep

python3中的编码

python2字符串编码存在的问题: 使用 ASCII 码作为默认编码方式,对中文处理不友好 把字符串分为 unicode 和 str 两种类型,将unicode作为唯一内码,误导开发者 python3中默认编码方式修改为utf-8. 在存储和显示上,python3使用文本字符和二进制数据进行区分,更加明确和清晰. 文本字符使用str类型表示,str 能表示 Unicode 字符集中所有字符,而二进制数据使用bytes类型表示. str与bytes之间的转换 一种方式 # bytes objec

python3与python2不一样的地方

进入不同语言版本的Python交互环境 py -2 py -3 pip 命令的执行 : py -2 -m pip install xxxx py -3 -m pip install nose 执行python文件 py -2 a.py py -3 a.py py2: print "hello" py3: print("hello") 如果不想py -2这样进入python2,可以 进入到python27的安装目录 把python.exe 修改为python2.exe

Python3.X-文本编码问题

1.请说明python2与python3的默认编码是什么? python的默认编码是ASCII码,python3的默认编码是utf-8 2.为什么会出现中文乱码?能列举出现乱码的情况有哪几种么? 编码的方式和解码的方式不一致,就会出现乱码现象. 比如:(1)文本内容是以gbk编码的,但是解码的方式却是utf-8,就会乱码 (2)文本内容是以ASCII进行编码的,那就不支持中文,如果往文本中添加中文,就会显示乱码. 解决方法:用chardet获取编码格式   import chardet str

Win10下安装Python3及Python2、数据类型、格式化输出、运算符

Win10下安装Python3及Python2 下载的官网地址: https://www.python.org/downloads/windows/ 安装Python3: 安装完成之后,在开始处输入 cmd ,测试Python是否安装成功. 输入: python -V ----> pip -v ----> pip 安装Python2: 安装完成之后,打开之前打开的命令提示符页面,测试Python是否安装成功. 输入: python -V ----> pip -v Python3.x与Py

一篇文章助你理解Python3中字符串编码问题

前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解Python2中字符串编码问题.下面在Python3环境中进行代码演示,分别Windows和Linux操作系统下进行演示,以加深对字符串编码的理解. 在Python2的Python文件的文件头往往会声明字符的编码格式,通过会使用代码"#-*- coding -*-"作为编码声明,如下图所示