Python如何读取16进制byte数据_第1页
Python如何读取16进制byte数据_第2页
Python如何读取16进制byte数据_第3页
Python如何读取16进制byte数据_第4页
Python如何读取16进制byte数据_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python如何读取16进制byte数据目录如何读取16进制byte数据Python的十六进制数转换关系hex()函数int()函数运算

如何读取16进制byte数据

小弟最近在做网络编程的时候,遇到了一些byte数据需要储存,但是不是常见的str字符对应的byte,类似于b\x00\xff\xfe\x01这样的数据,查找资料后发现这种东西是16进制编码的byte格式,可以直接转成str没有问题,但是再转回bytes就会出现莫名其妙的双斜杠,很是头疼。

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'"

尝试写入文件,再读取也是如此,因为写进去的形式就是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码,发现主要还是因为\x字符被理解成了一个斜杠加x的形式,然后被储存为str形式,相当于变成了两个字节。

这样解码的时候分开解了,但是\xnn这种形式是应该看作ASCII码的,于是我写了个转义的逻辑进行读取:

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'

问题解决了!基本就是写了个遍历,然后遇到\x就把16进制转成十进制的int,然后解码成bytes,这样常见的十六进制格式基本都能调用了。

后来发现除了\x还有其他的转义字符,比如\\,\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\\']

基本上至此为止,大部分编码形式都可以搞定了。

但是。。。其实还有一个更简单的方式!因为其实万恶之源就是str字符格式里面有很多转义的地方不清不楚的,我想要的是byte存进文件,再以byte读出来,而byte格式本来就是16进制的数字,说到底其实只要能存数字就可以了!所以写了个更简单的方法,直接转成数字存数字列表就好!

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'

存进去的是数字列表,然后用split的方式读出来就可以了,这样也不会有各种转义搞不清的地方,数字是什么就读什么byte出来就可以了。

Python的十六进制数

转换关系

十进制整数转十六进制整数用hex();十六进制整数转十进制整数用int()

类似地,十进制整数转二进制整数用bin();十进制整数转八进制整数用oct()

hex()函数

描述:hex()函数用于将10进制整数转换成16进制,以字符串形式表示。

语法:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论