广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何读取16进制byte数据
  • 389
分享到

Python如何读取16进制byte数据

2024-04-02 19:04:59 389人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录如何读取16进制byte数据python的十六进制数转换关系hex() 函数int() 函数运算如何读取16进制byte数据 小弟最近在做网络编程的时候,遇到了一些by

如何读取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'
with open('data.txt','w') as p:
    p.write(str(a))
 
# 读取data.txt
with open('data.txt','r') as p:
    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码的,于是我写了个转义的逻辑进行读取:

def readbytetxt(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,
    }
    with open(filename,'r') as p:
        line = p.readline()
        while line:
            if line[-1] == '\n':
                line = line[:-1]
            i = 2
            L = b''
            while i+1 < len(line):
                if line[i:i+2] == '\\x' and (line[i+2] in dic.keys()) and (line[i+3] in dic.keys()):
                    L += bytes([dic[line[i+2]]*16+dic[line[i+3]]])
                    i += 4
                else:
                    L += bytes(line[i],'utf8')
                    i += 1
            return L
            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,如果不添加转变逻辑的话,依然会出现不识别的问题,于是重写了一下函数,支持了常见的大部分转义字符,并且写成了生成器输出。

def readbytetxt2(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', 
    '\'': '\'',    '\"': '', 
    '\\': '\\', 
    }
    with open(filename,'r') as p:
        line = p.readline()
        while line:
            if line[-1] == '\n':
                line = line[:-1]
            i = 2
            L = b''
            while i+1 < len(line):
                if line[i:i+2] == '\\x' and (line[i+2] in dic.keys()) and (line[i+3] in dic.keys()):
                    L += bytes([dic[line[i+2]]*16+dic[line[i+3]]])
                    i += 4
                elif line[i] == '\\' and line[i+1] in dic2.keys():
                    L += bytes(dic2[line[i+1]],'utf8')
                    i += 2
                elif line[i:i+4] == '\\000':
                    L += bytes('\000','utf8')
                    i += 2
                else:
                    L += bytes(line[i],'utf8')
                    i += 1
            yield L
            line = p.readline()
 
a = b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdthe first line\n\r\a\b\t\\\f\'\"\v\b\n\000'
b = b'\xa0\xdf\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdthe second line\nn'
c = b'\xe0\xaf\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdthe third line\\'
with open('data.txt','w') as p:
    p.write(str(a)+'\n')
    p.write(str(b)+'\n')
    p.write(str(c))
 
line = readbytetxt2('data.txt')
 
print([a for a in line])
>>> [b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthe first line\n\r\x07\x08\\t\\\x0c\'"\x0b\x08\n\x00', b'\xa0\xdf\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthe second line\nn', b'\xe0\xaf\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthe third line\\']

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

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

L = []
a = b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x19\x39\xd9\x9d\xfdthe first line\n\r\a\b\t\\\f\'\"\v\b\n\000'
print(a)
for each in a:
    L.append(int(each))
with open('data.txt','w') as p:
    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]
 
 
with open('data.txt','r') as p:
    line = p.readline()
print(b''.join([bytes([int(i)]) for i in line[1:-1].split(',')]))
>>> b'\x00\xef\xa2\xa0\xb3\x8b\x9d\x1e\xf8\x98\x199\xd9\x9d\xfdthe first line\n\r\x07\x08\t\\\x0c\'"\x0b\x08\n\x00'

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

Python的十六进制数

转换关系

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

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

hex() 函数

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

语法:

  • hex(x)

参数说明:x – 10进制整数

返回值:返回16进制数,以字符串形式表示。

int() 函数

描述:int() 函数用于将一个字符串或数字转换为整型。

语法:

  • class int(x, base=10)

参数说明:x – 字符串或数字。base – 进制数,默认十进制。

返回值:返回整型数据。

运算

对于十六进制整数,在进行运算前先转换成十进制整数,再对其进行运算,之后将运算结果转换回十六进制数。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python如何读取16进制byte数据

本文链接: https://www.lsjlt.com/news/118170.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python如何读取16进制byte数据
    目录如何读取16进制byte数据Python的十六进制数转换关系hex() 函数int() 函数运算如何读取16进制byte数据 小弟最近在做网络编程的时候,遇到了一些by...
    99+
    2022-11-11
  • Python如何读取二进制数据
    在Python中,可以使用`open`函数来打开一个二进制文件,并使用`read`方法来读取二进制数据。下面是一个示例代码:```p...
    99+
    2023-09-08
    Python
  • Python如何存储和读取ASCII码形式的byte数据
    目录存储和读取ASCII码形式的byte数据Python ASCII码的获取存储和读取ASCII码形式的byte数据 Python可以存byte数据到txt,但不要用str的方式直接...
    99+
    2022-11-11
  • python如何表示2进制、8进制和16进制数字
    这篇文章主要介绍python如何表示2进制、8进制和16进制数字,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!表示2进制,8进制和16进制数字在2.6以上版本,以如下方式表示prin...
    99+
    2022-10-19
  • mysql如何将数据转为16进制
    mysql如何将数据转为16进制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。mysql转16进制的方法:1、使用he ...
    99+
    2022-10-19
  • python如何读取mongodb数据
    要在Python中读取MongoDB数据,您可以使用PyMongo库。以下是一个简单示例:首先,确保您已经安装了PyMongo库。您...
    99+
    2023-08-23
    python mongodb
  • 5.7:Python如何读取二进制文件?
    随着信息技术的不断发展,二进制数据已经成为了现代计算机应用中不可或缺的一部分。在许多情况下,我们需要读取和处理二进制数据,这些数据可能包括图像、音频、视频、压缩文件等。Python作为一种流行的编程语言,提供了多种方法和库,可以帮助我们读取...
    99+
    2023-09-01
    java linux 开发语言
  • Python如何读取MySQL数据库表数据
    本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参考,具体内容如下 环境:Python 3.6 ,Window 64bit 目的:从MySQL数据库读取目标表数据,并处理 代码:...
    99+
    2022-06-04
    数据库 数据 Python
  • javascript如何将数字转为16进制
    这篇“javascript如何将数字转为16进制”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2022-10-19
  • javascript如何将整数转为16进制
    这篇文章主要讲解了“javascript如何将整数转为16进制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript如何将整数转为16进制”吧!...
    99+
    2022-10-19
  • php如何将整数转为16进制
    这篇文章主要讲解了“php如何将整数转为16进制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何将整数转为16进制”吧!php将整数转为16进制的方法:1、使用dechex...
    99+
    2023-06-29
  • Python如何读取Excel表格数据
    环境: Pycharm IDE 3.9  2021.2.1 Excel作为目前主要的流行数据表格,其存储的数据整齐,强可观性。需要对大量的数据进行分析时,可以利用python脚本语言进行数据分析。 python读取excel数据: 打开py...
    99+
    2023-09-07
    excel
  • Python二进制字节流数据的读取操作是什么
    本篇内容主要讲解“Python二进制字节流数据的读取操作是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python二进制字节流数据的读取操作是什么”吧!bytesbytes:一种字符序列的...
    99+
    2023-07-05
  • Python二进制字节流数据的读取操作(bytes与bitstring)
    目录bytesbitstring最近项目有个需求,需要对二进制文件读取内容,操作读取到的字节流数据,主要是查找与切片获取内容。这要求有两个标志,一个开始,一个结束,获取中间的内容。 ...
    99+
    2023-03-13
    Python 二进制字节流读取 Python 字节流读取
  • php如何将字节数组转16进制
    这篇文章主要介绍“php如何将字节数组转16进制”,在日常操作中,相信很多人在php如何将字节数组转16进制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何将字节数组转16进制”的疑惑有所帮助!接下来...
    99+
    2023-06-22
  • php如何将16进制转为浮点数
    本篇内容主要讲解“php如何将16进制转为浮点数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何将16进制转为浮点数”吧!php将16进制转为浮点数的方法:1、使用“hexdec(十六进...
    99+
    2023-06-30
  • python如何读取文件中的数据
    Python中可以使用open()函数来读取文件中的数据。下面是一个基本的使用示例:```pythonfile = open("fi...
    99+
    2023-09-14
    python
  • Python如何读取excel表格的数据
    这篇文章主要介绍“Python如何读取excel表格的数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何读取excel表格的数据”文章能帮助大家解决问题。小编这里推荐使用一款兼容性非...
    99+
    2023-06-27
  • python如何读取网络端口数据
    Python提供了多种方法来读取网络端口数据,以下是其中一种常见的方法:```pythonimport socket# 创建一个TC...
    99+
    2023-08-25
    python
  • 如何在Python读取与存储数据
    这篇文章将为大家详细讲解有关如何在Python读取与存储数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、图示二、csv文件读取csv文件read_csv(file_path or bu...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作