




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第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ǔ)存,但是不是常見(jiàn)的str字符對(duì)應(yīng)的byte,類(lèi)似于b\x00\xff\xfe\x01這樣的數(shù)據(jù),查找資料后發(fā)現(xiàn)這種東西是16進(jìn)制編碼的byte格式,可以直接轉(zhuǎn)成str沒(méi)有問(wèn)題,但是再轉(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'"
嘗試寫(xiě)入文件,再讀取也是如此,因?yàn)閷?xiě)進(jìn)去的形式就是str字符
#寫(xiě)入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í)候分開(kāi)解了,但是\xnn這種形式是應(yīng)該看作ASCII碼的,于是我寫(xiě)了個(gè)轉(zhuǎn)義的邏輯進(jìn)行讀取:
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'
問(wèn)題解決了!基本就是寫(xiě)了個(gè)遍歷,然后遇到\x就把16進(jìn)制轉(zhuǎn)成十進(jìn)制的int,然后解碼成bytes,這樣常見(jiàn)的十六進(jìn)制格式基本都能調(diào)用了。
后來(lái)發(fā)現(xiàn)除了\x還有其他的轉(zhuǎn)義字符,比如\\,\n,如果不添加轉(zhuǎn)變邏輯的話(huà),依然會(huì)出現(xiàn)不識(shí)別的問(wèn)題,于是重寫(xiě)了一下函數(shù),支持了常見(jiàn)的大部分轉(zhuǎn)義字符,并且寫(xiě)成了生成器輸出。
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è)更簡(jiǎn)單的方式!因?yàn)槠鋵?shí)萬(wàn)惡之源就是str字符格式里面有很多轉(zhuǎn)義的地方不清不楚的,我想要的是byte存進(jìn)文件,再以byte讀出來(lái),而byte格式本來(lái)就是16進(jìn)制的數(shù)字,說(shuō)到底其實(shí)只要能存數(shù)字就可以了!所以寫(xiě)了個(gè)更簡(jiǎn)單的方法,直接轉(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的方式讀出來(lái)就可以了,這樣也不會(huì)有各種轉(zhuǎn)義搞不清的地方,數(shù)字是什么就讀什么byte出來(lái)就可以了。
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()
類(lèi)似地,十進(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)制,以字符串形式表示。
語(yǔ)法:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五一活動(dòng)美業(yè)活動(dòng)方案
- 產(chǎn)業(yè)園推介活動(dòng)方案
- 產(chǎn)科qcc活動(dòng)方案
- 京東往年情人節(jié)活動(dòng)方案
- 京劇進(jìn)校園活動(dòng)方案
- 親子互動(dòng)道路活動(dòng)方案
- 親子公園環(huán)?;顒?dòng)方案
- 親子創(chuàng)意拔河活動(dòng)方案
- 親子開(kāi)發(fā)活動(dòng)策劃方案
- 2024年中考一模 模擬卷 數(shù)學(xué)(貴州卷)(參考答案及評(píng)分標(biāo)準(zhǔn))
- 施工進(jìn)度計(jì)劃表(參考模板)
- 《項(xiàng)目五:新能源汽車(chē)制動(dòng)系統(tǒng)》工作頁(yè)
- 誤吸評(píng)價(jià)表完整優(yōu)秀版
- 汽車(chē)修理行業(yè)危險(xiǎn)廢物管理
- DL∕T 2101-2020 架空輸電線(xiàn)路固定翼無(wú)人機(jī)巡檢系統(tǒng)
- 園林綠化工程安全和功能檢驗(yàn)資料核查及主要功能抽查記錄
- 2022更新國(guó)家開(kāi)放大學(xué)電大《計(jì)算機(jī)應(yīng)用基礎(chǔ)(專(zhuān))》終結(jié)性考試大作業(yè)答案任務(wù)一
- 羅伊護(hù)理個(gè)案模板
- 速達(dá)ERP-5000數(shù)據(jù)庫(kù)表結(jié)構(gòu)
- 《高尿酸血癥》PPT課件(PPT 48頁(yè))
- 鹽田區(qū)義務(wù)教育階段學(xué)位住房鎖定
評(píng)論
0/150
提交評(píng)論