Python如何讀取16進(jìn)制byte數(shù)據(jù)_第1頁
Python如何讀取16進(jìn)制byte數(shù)據(jù)_第2頁
Python如何讀取16進(jìn)制byte數(shù)據(jù)_第3頁
Python如何讀取16進(jìn)制byte數(shù)據(jù)_第4頁
Python如何讀取16進(jìn)制byte數(shù)據(jù)_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論