




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Python如何讀取16進(jìn)制byte數(shù)據(jù)目錄如何讀取16進(jìn)制byte數(shù)據(jù)Python的十六進(jìn)制數(shù)轉(zhuǎn)換關(guān)系hex()函數(shù)int()函數(shù)運(yùn)算
如何讀取16進(jìn)制byte數(shù)據(jù)
小弟最近在做網(wǎng)絡(luò)編程的時(shí)候,遇到了一些byte數(shù)據(jù)需要儲(chǔ)存,但是不是常見的str字符對(duì)應(yīng)的byte,類似于b\x00\xff\xfe\x01這樣的數(shù)據(jù),查找資料后發(fā)現(xiàn)這種東西是16進(jìn)制編碼的byte格式,可以直接轉(zhuǎn)成str沒有問題,但是再轉(zhuǎn)回bytes就會(huì)出現(xiàn)莫名其妙的雙斜杠,很是頭疼。
a=b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdABCDabcd'
b=str(a)
print(b)
b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdABCDabcd'
print(bytes(b,'utf8'))
b"b'\\x00\\xef\\xa2\\xa0\\xb3\\x8b\\x9d\\x1e\\xf8\\x98\\x199\\xd9\\x9d\\xfdABCDabcd'"
嘗試寫入文件,再讀取也是如此,因?yàn)閷戇M(jìn)去的形式就是str字符
#寫入data.txt
a=b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdABCDabcd'
withopen('data.txt','w')asp:
p.write(str(a))
#讀取data.txt
withopen('data.txt','r')asp:
line=p.readline()
print(line,type(line)==str)
b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdABCDabcd\\'True
print(bytes(line,'utf8'))
b"b'\\x00\\xef\\xa2\\xa0\\xb3\\x8b\\x9d\\x1e\\xf8\\x98\\x199\\xd9\\x9d\\xfdABCDabcd\\\\'"
觀察了一下ASCII碼,發(fā)現(xiàn)主要還是因?yàn)閈x字符被理解成了一個(gè)斜杠加x的形式,然后被儲(chǔ)存為str形式,相當(dāng)于變成了兩個(gè)字節(jié)。
這樣解碼的時(shí)候分開解了,但是\xnn這種形式是應(yīng)該看作ASCII碼的,于是我寫了個(gè)轉(zhuǎn)義的邏輯進(jìn)行讀?。?/p>
defreadbytetxt(filename):
dic={
'0':0,
'1':1,
'2':2,
'3':3,
'4':4,
'5':5,
'6':6,
'7':7,
'8':8,
'9':9,
'a':10,
'b':11,
'c':12,
'd':13,
'e':14,
'f':15,
}
withopen(filename,'r')asp:
line=p.readline()
whileline:
ifline[-1]=='\n':
line=line[:-1]
i=2
L=b''
whilei+1len(line):
ifline[i:i+2]=='\\x'and(line[i+2]indic.keys())and(line[i+3]indic.keys()):
L+=bytes([dic[line[i+2]]*16+dic[line[i+3]]])
i+=4
else:
L+=bytes(line[i],'utf8')
i+=1
returnL
line=p.readline()
print(readbytetxt('data.txt'))
b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdABCDabcd'
問題解決了!基本就是寫了個(gè)遍歷,然后遇到\x就把16進(jìn)制轉(zhuǎn)成十進(jìn)制的int,然后解碼成bytes,這樣常見的十六進(jìn)制格式基本都能調(diào)用了。
后來發(fā)現(xiàn)除了\x還有其他的轉(zhuǎn)義字符,比如\\,\n,如果不添加轉(zhuǎn)變邏輯的話,依然會(huì)出現(xiàn)不識(shí)別的問題,于是重寫了一下函數(shù),支持了常見的大部分轉(zhuǎn)義字符,并且寫成了生成器輸出。
defreadbytetxt2(filename):
dic={
'0':0,
'1':1,
'2':2,
'3':3,
'4':4,
'5':5,
'6':6,
'7':7,
'8':8,
'9':9,
'a':10,
'b':11,
'c':12,
'd':13,
'e':14,
'f':15,
}
dic2={
'a':'\a',
'b':'\b',
'f':'\f',
'n':'\n',
'r':'\r',
'v':'\v',
'\'':''',
'\"':'',
'\\':'\\',
}
withopen(filename,'r')asp:
line=p.readline()
whileline:
ifline[-1]=='\n':
line=line[:-1]
i=2
L=b''
whilei+1len(line):
ifline[i:i+2]=='\\x'and(line[i+2]indic.keys())and(line[i+3]indic.keys()):
L+=bytes([dic[line[i+2]]*16+dic[line[i+3]]])
i+=4
elifline[i]=='\\'andline[i+1]indic2.keys():
L+=bytes(dic2[line[i+1]],'utf8')
i+=2
elifline[i:i+4]=='\\000':
L+=bytes('\000','utf8')
i+=2
else:
L+=bytes(line[i],'utf8')
i+=1
yieldL
line=p.readline()
a=b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdthefirstline\n\r\a\b\t\\\f\'"vbn000'
b=b'xa0xdfxa2xa0xb3x8bx9dx1exf8x98x19x39xd9x9dxfdthesecondlinenn'
c=b'xe0xafxa2xa0xb3x8bx9dx1exf8x98x19x39xd9x9dxfdthethirdline\'
withopen('data.txt','w')asp:
p.write(str(a)+'n')
p.write(str(b)+'n')
p.write(str(c))
line=readbytetxt2('data.txt')
print([aforainline])
[b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthefirstline\n\r\x07\x08\\t\\\x0c\'"\x0b\x08\n\x00',b'\xa0\xdf\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthesecondline\nn',b'\xe0\xaf\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthethirdline\\']
基本上至此為止,大部分編碼形式都可以搞定了。
但是。。。其實(shí)還有一個(gè)更簡單的方式!因?yàn)槠鋵?shí)萬惡之源就是str字符格式里面有很多轉(zhuǎn)義的地方不清不楚的,我想要的是byte存進(jìn)文件,再以byte讀出來,而byte格式本來就是16進(jìn)制的數(shù)字,說到底其實(shí)只要能存數(shù)字就可以了!所以寫了個(gè)更簡單的方法,直接轉(zhuǎn)成數(shù)字存數(shù)字列表就好!
L=[]
a=b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdthefirstline\n\r\a\b\t\\\f\'\"\v\b\n\000'
print(a)
foreachina:
L.append(int(each))
withopen('data.txt','w')asp:
p.write(str(L))
print(L)
[0,239,162,160,179,139,157,30,248,152,25,57,217,157,253,116,104,101,32,102,105,114,115,116,32,108,105,110,101,10,13,7,8,9,92,12,39,34,11,8,10,0]
withopen('data.txt','r')asp:
line=p.readline()
print(b''.join([bytes([int(i)])foriinline[1:-1].split(',')]))
b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthefirstline\n\r\x07\x08\t\\\x0c\'"x0bx08nx00'
存進(jìn)去的是數(shù)字列表,然后用split的方式讀出來就可以了,這樣也不會(huì)有各種轉(zhuǎn)義搞不清的地方,數(shù)字是什么就讀什么byte出來就可以了。
Python的十六進(jìn)制數(shù)
轉(zhuǎn)換關(guān)系
十進(jìn)制整數(shù)轉(zhuǎn)十六進(jìn)制整數(shù)用hex();十六進(jìn)制整數(shù)轉(zhuǎn)十進(jìn)制整數(shù)用int()
類似地,十進(jìn)制整數(shù)轉(zhuǎn)二進(jìn)制整數(shù)用bin();十進(jìn)制整數(shù)轉(zhuǎn)八進(jìn)制整數(shù)用oct()
hex()函數(shù)
描述:hex()函數(shù)用于將10進(jìn)制整數(shù)轉(zhuǎn)換成16進(jìn)制,以字符串形式表示。
語法:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 道路工程清包工合同協(xié)議
- 配送業(yè)務(wù)承包合同協(xié)議
- 水樣比對(duì)協(xié)議書
- 旱地承包協(xié)議書
- 車輛保養(yǎng)服務(wù)合同協(xié)議
- 轉(zhuǎn)讓木材烘干房合同協(xié)議
- 連鎖加盟店合同協(xié)議
- 泥工承包協(xié)議書
- 賠款協(xié)商協(xié)議書范本
- 外語考試需掌握的技巧及答案
- 2024年安徽省高考生物試卷(真題+答案)
- 高中歷史中外歷史綱要上新教材習(xí)題答案
- 創(chuàng)業(yè)基礎(chǔ)智慧樹知到期末考試答案章節(jié)答案2024年山東大學(xué)
- 小學(xué)數(shù)學(xué)人教版二年級(jí)下冊(cè)《千克的認(rèn)識(shí)》教學(xué)設(shè)計(jì)
- 新版設(shè)計(jì)圖紙合同
- 離散數(shù)學(xué)(上)智慧樹知到期末考試答案章節(jié)答案2024年桂林電子科技大學(xué)
- 水滸林沖人物介紹
- SYT 6680-2021 石油天然氣鉆采設(shè)備 鉆機(jī)和修井機(jī)出廠驗(yàn)收規(guī)范-PDF解密
- 2022年湖北省新高考化學(xué)試卷和答案解析
- 9古詩三首《秋夜將曉出籬門迎涼有感》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)-1
- 涉賭涉詐資金風(fēng)險(xiǎn)排查報(bào)告
評(píng)論
0/150
提交評(píng)論