Python: 二进制字节流数据的读取操作 -- bytes 与 bitstring

Python: 二进制字节流数据的读取操作 – bytes 与 bitstring
最近项目有个需求,需要对二进制文件读取内容,操作读取到的字节流数据,主要是查找与切片获取内容。这要求有两个标志,一个开始,一个结束,获取中间的内容。

Python 的 bytes 内置了一些方法,但是却不完美。在调查后,了解到 bitstring 这个第三方包,在对字节流数据的处理上,似乎更合适。

bytes
bytes:一种字符序列的类型。通过比较 dir(str) 与 dir(bytes) 可知,两者的属性与方法很相似,只有少数几个不同。所以 bytes 也是可以像 string 一样,对字节序列有各种操作方法,如查找(find),求长度(len),切割(split),切片等。

bytes 的优点是:Python 内置的方法,不需要的额外的安装三方模块。

但缺点也很明显:只能单个查询,不能一次查询多个需要的结果。

首先通过 open 的 rb 模式打开文件,读取内容为 bytes 类型。查找特定字符串有 find() 方法,但是此方法只能找到第一个符合要求的字符串索引,并且给出的不是单个位的索引,而是 8 位一个字节的索引。当需要查找多个符合的字符串,却没有内置的 findall() 方法。如果要查询多个,过程会麻烦,首先查到第一个符合的索引 1,以此索引 1 为开始,查询第二个符合的索引 2,以此类推,直到查询结束

原文链接:https://blog.youkuaiyun.com/zsh501736479/article/details/117196324

<think>嗯,用户问的是二进制和字节数组的区别和联系。首先,我得先确认这两个概念的定义。二进制是一种数制,用0和1表示数据,而字节数组是计算机中存储二进制数据的一种结构。可能需要从数据表示、存储方式、应用场景这几个方面来分析。 首先,二进制是计算机的基础,所有数据最终都是以二进制形式存储的。每个二进制位就是一个比特,8个比特组成一个字节。字节数组则是由多个字节连续组成的结构,每个字节可以表示0到255的数值。所以字节数组实际上是二进制数据在程序中的一种组织形式。 然后,区别方面,二进制是更底层的概念,而字节数组是更高层的抽象。二进制数据可以以不同的形式存在,比如文本、图像等,但字节数组是程序中的数据结构,用于方便操作这些二进制数据。例如,在编程中处理文件时,通常会将文件内容读取为字节数组,这样更容易进行逐字节的处理。 联系方面,字节数组中的每个元素对应一个字节的二进制数据。例如,字节数组中的元素0x48对应的二进制是01001000,这在ASCII中代表字符'H'。所以字节数组实际上是将二进制数据以字节为单位进行分组存储的结构。 可能还要提到编码的问题,比如字符串转换成字节数组时需要考虑字符编码方式,不同的编码会影响字节数组的内容。例如,UTF-8和GBK编码下,同一个中文字符对应的字节数组可能不同。 用户提供的引用中提到了Java中使用ByteBuffer处理字节数组的例子,说明字节数组在编程中的实际应用。比如,网络传输或文件IO时,数据通常以字节数组的形式处理,而底层还是二进制的比特流。 还要注意用户可能的实际需求,比如他们可能在处理文件传输、加密解密或数据序列化时遇到相关问题。需要确保回答涵盖这些应用场景,帮助用户理解两者如何在实际编程中结合使用。 最后,生成相关问题时,可以围绕转换方法、编码影响、实际应用等方面展开,帮助用户进一步深入学习。</think>### 二进制字节数组的区别和联系 #### 1. **二进制数据** - **定义**:二进制是计算机底层使用的基本数制系统,仅包含0和1两种状态。所有数据(文本、图像、程序等)最终都以二进制形式存储,例如数字$10$的二进制表示为$1010_2$。 - **特点**:每个二进制位(bit)是存储的最小单位,8位组成1字节(byte),例如字节`01100001`表示十进制数$97$,对应ASCII字符`a`[^1]。 #### 2. **字节数组** - **定义**:字节数组是编程中用于存储二进制数据的连续内存空间,每个元素对应一个字节(8位)。例如Java中的`byte[]`或Python的`bytes`类型。 - **特点**: - 每个元素范围为$0$到$255$(无符号)或$-128$到$127$(有符号)。 - 常用于文件读写、网络通信等场景,如Java中`ByteBuffer`操作字节数组。 #### 3. **区别** | 维度 | 二进制数据 | 字节数组 | |------------|--------------------------|--------------------------| | 表现形式 | 原始比特流(0/1序列) | 结构化数据容器(编程对象)| | 存储层级 | 底层物理存储形式 | 高层抽象表示 | | 操作方式 | 需按位处理 | 按字节或块操作 | #### 4. **联系** - **转换关系**:字节数组是二进制数据的逻辑分组。例如二进制流`01000001 01000010`对应字节数组`[0x41, 0x42]`,表示字符串`"AB"`。 - **编码依赖**:字符串到字节数组需指定编码(如UTF-8),例如`"中"`的UTF-8编码为字节数组`[0xE4, 0xB8, 0xAD]`,对应二进制`11100100 10111000 10101101`。 #### 5. **应用示例** ```java // Java示例:将16进制字符串转为字节数组 String hex = "48656C6C6F"; // "Hello"的16进制表示 byte[] bytes = new byte[hex.length() / 2]; for (int i = 0; i < bytes.length; i++) { bytes[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值