我們經(jīng)常需要對內(nèi)容進行加密傳輸、或者跟服務器交互的時候簽名,驗證信息的真?zhèn)瓮硗獭3R姷姆椒ǎ篵ase64轉碼延旧、urlencode編碼、進制間互轉槽地、MD5
求hash迁沫、AES加密等芦瘾。在python中的實現(xiàn)方式,筆錄如下:
[TOC]
base64在python中
字符串轉base64
在python3中集畅,字符都是unicode編碼格式近弟,base64.b64encode的參數(shù)需為byte類型,需要先做轉換挺智。
import base64
_str = 'abcde' # 待編碼字符
_str2b64 = base64.b64encode( _str.encode('utf-8') )
print(_str2b64) # b'YWJjZGU='
輸出是:b'YWJjZGU='
這里b的意思是byte的意思祷愉,需要再次轉換:
_str2b64 = str(_str2b64 ,'utf-8')
print(_str2b64 ) #YWJjZGU=
base64轉字符串
將base64轉會字符串,只需要用base64.b64decode( b64 )
赦颇,演示如下:
linux命令行轉換
echo '字符串'|base64
輸出5a2X56ym5LiyCg==
;
逆轉:echo '5a2X56ym5LiyCg==' |base64 -d
二鳄。
這種方法的好處是不需要寫代碼,命令行輕松搞定媒怯。
URLDECODE與URLENCODE編碼解碼
一般都是用urllib庫實現(xiàn)的订讼,把python中的字典轉化為請求參數(shù)的形式:
import urllib.parse
values={}
values['username']='02蔡彩虹'
values['password']='ddddd?'
url="http://www.baidu.com"
data=urllib.parse.urlencode(values)
print(data)
username=02%E8%94%A1%E5%BD%A9%E8%99%B9&password=ddddd%3F
如果你只想對字符串進行編碼,可以使用quote()
:
_str = '要轉碼的字符串a(chǎn)bcde123&&*'
print( urllib.parse.quote(_str) )
# %E8%A6%81%E8%BD%AC%E7%A0%81%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2abcde123%26%26%2A
urldecode解碼
使用urllib.parse.unquote()
方法即可
print( urllib.parse.unquote( urllib.parse.quote(_str) ) )
# 要轉碼的字符串a(chǎn)bcde123&&*
MD5計算哈希
非堆成加密計算簽名時常用扇苞。
import hashlib
def md5( pass_text):
hl = hashlib.md5()
hl.update(pass_text.strip().encode(encoding='utf-8'))
pass_md5 = hl.hexdigest()
return pass_md5
print( md5('一段字符串') )
MD5無法逆轉欺殿,校驗結果也只是對加密后的內(nèi)容進行字符串比較。
進制轉換
hex轉字符串
a = 'aabbccddeeff'
a_bytes = bytes.fromhex(a)
print(a_bytes)
# b'\xaa\xbb\xcc\xdd\xee\xff'
aa = a_bytes.hex()
print(aa)
# aabbccddeeff
# bytes轉字符串方式一
b=b'\xe9\x80\x86\xe7\x81\xab'
string=str(b,'utf-8')
print(string)
# bytes轉字符串方式二
b=b'\xe9\x80\x86\xe7\x81\xab'
string=b.decode() # 第一參數(shù)默認utf8鳖敷,第二參數(shù)默認strict
print(string)
# bytes轉字符串方式三
b=b'\xe9\x80\x86\xe7\x81haha\xab'
string=b.decode('utf-8','ignore') # 忽略非法字符脖苏,用strict會拋出異常
print(string)
# bytes轉字符串方式四
b=b'\xe9\x80\x86\xe7\x81haha\xab'
string=b.decode('utf-8','replace') # 用?取代非法字符
print(string)
# 字符串轉bytes方式一
str1='逆火'
b=bytes(str1, encoding='utf-8')
print(b)
# 字符串轉bytes方式二
b=str1.encode('utf-8')
print(b)
更多(轉載)
進行協(xié)議解析時哄陶,總是會遇到各種各樣的數(shù)據(jù)轉換的問題帆阳,從二進制到十進制,從字節(jié)串到整數(shù)等等
整數(shù)之間的進制轉換:
10進制轉16進制: hex(16) ==> 0x10
16進制轉10進制: int('0x10', 16) ==> 16
類似的還有oct()
屋吨, bin()
字符串轉整數(shù):
10進制字符串:int('10') ==> 10
16進制字符串: int('10', 16) ==> 16
16進制字符串: int('0x10', 16) ==> 16
字節(jié)串轉整數(shù):
轉義為short型整數(shù): struct.unpack('<hh', bytes(b'\x01\x00\x00\x00')) ==> (1, 0)
轉義為long型整數(shù): struct.unpack('<L', bytes(b'\x01\x00\x00\x00')) ==> (1,)
整數(shù)轉字節(jié)串:
轉為兩個字節(jié): struct.pack('<HH', 1,2) ==> b'\x01\x00\x02\x00'
轉為四個字節(jié): struct.pack('<LL', 1,2) ==> b'\x01\x00\x00\x00\x02\x00\x00\x00'
字符串轉字節(jié)串:
字符串編碼為字節(jié)碼: '12abc'.encode('ascii') ==> b'12abc'
數(shù)字或字符數(shù)組: bytes([1,2, ord('1'),ord('2')]) ==> b'\x01\x0212'
16進制字符串: bytes().fromhex('010210') ==> b'\x01\x02\x10'
16進制字符串: bytes(map(ord, '\x01\x02\x31\x32')) ==> b'\x01\x0212'
16進制數(shù)組: bytes([0x01,0x02,0x31,0x32]) ==> b'\x01\x0212'
字節(jié)串轉字符串:
字節(jié)碼解碼為字符串: bytes(b'\x31\x32\x61\x62').decode('ascii') ==> 12ab
字節(jié)串轉16進制表示,夾帶ascii: str(bytes(b'\x01\x0212'))[2:-1] ==> \x01\x0212
字節(jié)串轉16進制表示,固定兩個字符表示: str(binascii.b2a_hex(b'\x01\x0212'))[2:-1] ==> 01023132
字節(jié)串轉16進制數(shù)組: [hex(x) for x in bytes(b'\x01\x0212')] ==> ['0x1', '0x2', '0x31', '0x32']