Python中字節(jié)數(shù)組和16進制字符串轉換方式
Python字節(jié)數(shù)組和16進制字符串轉換
參考示例1
以下示例僅供參考,性能高低以實際測試情況為準,這里只考慮能否實現(xiàn)數(shù)據(jù)轉換
字節(jié)(bytes)轉字符串(str)
rec_msg = b'\x12\x55\xaa\xFF\x55\x34' out_s = '' ? for i in range(0, len(rec_msg)): ? ? # 獲取字節(jié)數(shù)組字數(shù)據(jù),注意引號 ' ' 之間有一個空格 ? ? out_s = out_s + ' ' + (hex(int(rec_msg[i]))).upper()[2:].zfill(2) print(out_s) ? ?# >>> 12 55 AA FF 55 34
轉換原理解析:分離出byte,轉為int(), 再hex()轉回16進制數(shù)后截取0x前綴,再遍歷拼接成字符串
參考示例2
在例子中對指定的字符串:
faa5fbb5fcc5fdd5010200000028000001900000000a002d00000000017d7840000003e800005fa55fb55fc55fd5
使用了三種方法將其轉換為大寫字母并每隔2個字符用空格分割處理后得到一個新字符串,為:
FA A5 FB B5 FC C5 FD D5 01 02 00 00 00 28 00 00 01 90 00 00 00 0A 00 2D 00 00 00 00 01 7D 78 40 00 00 03 E8 00 00 5F A5 5F B5 5F C5 5F D5
為驗證三種方法的執(zhí)行效率,對原字符串擴充為其100倍長度,然后執(zhí)行10000次處理,從其耗時結果上看,第一種方法最慢,第二、三種方法較好。
# -*- coding: utf-8 -*-#
#-------------------------------------------------------------------------------
# Name: ? ? ? ? MySplit
# Description: ?將指定的字符串轉換為大寫字母并每隔2個字符用空格分割后得到一個新字符串
# Author: ? ? ? Administrator
# Date: ? ? ? ? 2018/7/6
#-------------------------------------------------------------------------------
import re
import time
#待分割字符串
myStr = 'faa5fbb5fcc5fdd5010200000028000001900000000a002d00000000017d7840000003e800005fa55fb55fc55fd5'
#分割后: FA A5 FB B5 FC C5 FD D5 01 02 00 00 00 28 00 00 01 90 00 00 00 0A 00 2D 00 00 00 00 01 7D 78 40 00 00 03 E8 00 00 5F A5 5F B5 5F C5 5F D5
def mySplit1(str):
? ? t=''
? ? for i in range(len(str)/2):
? ? ? ? t += str[2*i:2*(i+1)] + ' '
? ? t = t.upper()
? ? return t
def mySplit2(str):
? ? t = str.upper()
? ? p = re.compile('.{1,2}') ?# 匹配任意字符1-2次
? ? return ' '.join(p.findall(t))
def mySplit3(str):
? ? t = str.upper()
? ? return ' '.join([t[2*i:2*(i+1)] for i in range(len(t)/2)])
print('原始字符串:\n' + myStr + '\n')
print('轉換后字符串:')
print('mySplit1: ' + mySplit1(myStr))
print('mySplit2: ' + mySplit2(myStr))
print('mySplit3: ' + mySplit3(myStr))
print(u'\n耗時測試:')
myStr = myStr * 100
for f in [mySplit1, mySplit2, mySplit3]:
? ? t = time.time()
? ? for i in range(10000):
? ? ? ? f(myStr)
? ? print(f.func_name + ': ' + str(time.time()-t) + ' s')假設:
hex_string = “deadbeef”
轉換成字符串格式
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"轉換成字節(jié)數(shù)組
>>> import array
>>> array.array('B', hex_data)
array.array('B', [0xDE, 0xAD, 0xBE, 0xEF])轉換成字節(jié)列表
>>> map(ord, hex_data) [0xDE, 0xAD, 0xBE, 0xEF]
如果是2.6以后版本:
>>> bytearray(hex_data) bytearray(b'\xde\xad\xbe\xef')
然而有可能出現(xiàn)無法打印的字符串,例如:\x12\x45\x00AB
這種情況下:不要用.decode(“hex”)
下面的將返回bytearray,并在python3中正常工作
bytearray.fromhex(“de ad be ef 00”)
使用binascii
import binascii a='45222e' s=binascii.unhexlify(a) b=[ord(x) for x in s]
直接編寫程序
data = "fef0babe" bits = "" for x in xrange(0, len(data), 2) ? ? bits += chr(int(data[x:x+2], 16))
還原byte型字符串
binascii.b2a_hex(hex_data)
Python簡單的16進制轉字符串
Python以字符串形式存在的16進制數(shù),轉為該16進制對應的ascii字符串比較麻煩。
如:
hex_str = ‘7468616e6b20796f752076657279206d75636821' # thank you very much!
首先要將其轉為16進制數(shù)
hex = hex_str.encode(‘utf-8')
然后再轉為字符串
str_bin = binascii.unhexlify(hex) str = str_bin.decode(‘utf-8')
函數(shù):
import binascii
def hexStr_to_str(hex_str):
hex = hex_str.encode('utf-8')
str_bin = binascii.unhexlify(hex)
return str_bin.decode('utf-8')
if __name__ == "__main__":
hex_str = '7468616e6b20796f752076657279206d75636821'
print(hexStr_to_str(hex_str))簡單方法來了
我們知道,base16編碼就是將字符用16進制表示
'a' =base16=> b'61'
那么簡單對16進制字符串進行base16解碼即可
import base64 hex_str = '7468616e6b20796f752076657279206d75636821'? print(base64.b16decode(hex_str.upper()))
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
在spyder IPython console中,運行代碼加入?yún)?shù)的實例
這篇文章主要介紹了在spyder IPython console中,運行代碼加入?yún)?shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Jmeter并發(fā)執(zhí)行Python 腳本的完整流程
這篇文章主要介紹了Jmeter并發(fā)執(zhí)行 Python 腳本的問題詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
基于python對B站收藏夾按照視頻發(fā)布時間進行排序的問題
這篇文章主要介紹了基于python對B站收藏夾按照視頻發(fā)布時間進行排序,在實現(xiàn)過程中中間程序可能因為各種原因掛掉,因此在中間加入了儲存中間狀態(tài)的功能,否則每次掛掉都要重新爬速度非常慢,本文給大家介紹具體使用方法,一起看看吧2021-05-05

