源地址: https://www.cnblogs.com/xiaoxiao-niao/p/8266768.html
[popexizhi:
分析原文写法的好处,遇到的问题和解决过程很清晰,事后分析也很明确。
pope的问题?过程写的很细节没有整体概况,准确度和整体性如何协调,排版上如何可以好的体现??
]
第一次:python3传的是bytes不能是str。好吧,认了。我就传bytes吧
b= hmac.new('/admindevice/GetCameraSetting','adbaskjclas',sha1).hexdigest() print(b)
File "/usr/lib64/python3.6/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)
File "/usr/lib64/python3.6/hmac.py", line 93, in update self.inner.update(msg) TypeError: Unicode-objects must be encoded before hashing
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数据 最长的例子:quote(base64.b64encode(bytes(hmac.new(bytes(service_key_secret,'utf-8'), (bytes(verufy_url,'utf-8') +bytes("\n",'utf-8')+ bytes(str(self.timetamp),'utf-8')), sha1).hexdigest(),'utf-8')))
没有评论:
发表评论