




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年棕榈油酸行业市场深度调研及发展前景趋势与投融资研究报告
- 2025-2030年户外用品行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年咖啡行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年卫生巾行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年功能型饮料行业市场发展分析及发展趋势与投资研究报告
- 2025-2030年全自动封杯机市场前景分析及投资策略与风险管理研究报告
- 水电项目生命周期管理试题及答案
- 工程经济市场需求考察试题及答案
- 2025年市政工程考试对新人的培养策略及试题及答案
- 2024年水利水电工程获取社会支持的方法的试题及答案
- 肾衰竭病历范文
- 建设项目全过程工程咨询-第二次形成性考核-国开(SC)-参考资料
- 《中医诊断学》-辨证
- 骨质疏松用药治疗
- 2024信息安全意识培训课件完整版含内容
- 《炎症与冠心病》课件
- 2024国家电网公司(第二批)招聘国家电网公司华北分部管理单位遴选500模拟题附带答案详解
- 《汽车灯具的标准》课件
- 一例糖尿病酮中毒个案护理
- GB/T 18601-2024天然花岗石建筑板材
- 第6课 全球航路的开辟 说课稿 -2023-2024学年高一下学期统编版(2019)必修中外历史纲要下册
评论
0/150
提交评论