python学习随笔5

上周末处理一些数据,二进制数据以txt文件形式存放。数据格式为:0bxxxx。实则该二进制数据来源于16进制数据。通过bin(int(xx,16))方式进行转换,理论上完成了有16进制到2进制的转换。然而,该方式存在一个致命的缺点,那就是数据位丢了。下面我们就来阐述如何解决这个问题。

问题的严重性

值得说明的是,这里的数据位丢失并非在转换过程中出现错误。文字表达起来总会缺点什么,我们来举个栗子吧,(P.S我大学时候给同学讲题的口头禅,哈哈哈)。比如说,ox51–>0b101_0001,说明一下这里的下划线是为了看得清楚而加。显然我们看出来16进制的‘5’在转化为2进制时只显示三位,应该是转化为四位呀,应该是0b0101。那么还有一位零哪里去了呢?我姑且称之为数据位的丢了。不是我较真,这个零不见了有时候是很致命的,特别是在使用python处理数据时。你说前面10K的数据都对的整整齐齐,突然在第10001时发现数据‘凹’了,之后的数据又是对的整整齐齐。这可怎么玩,没得玩呀,用python处理的数据就会出现错误,这就尴尬呀。

解决思路

前面说到了数据位丢,导致的‘尴尬’。那么接下来就谈一谈,如何解决这个问题。大腿一拍,补不就完事了吗?不无道理,可是怎么补,手工补吗?当然不是,肯定是让电脑去补呀。是的,出现缺位那么补数据肯定是正确的思路,还有一个思路就是自己编写一个转换函数。说到转换函数,解释一下bin(int(xx,16))的含义吧。首先,对整个表达式进行拆分,拆分为两部份,1、bin(), 2、int()。其次,说一说bin(),bin()实则为将10进制数转化为2进制数。再者,谈一谈int(),int(xx,16)表示将xx数转换10进制数。xx为16进制数,所以才有int(xx,16)中16的说法。好了到这里我们提出了两种解决数据位缺失的问题,下面就采用第一种方法——补位。

解决方案

具体做法为,这里采用2位16进制数转换为8位2进制数为例进行说明:采用bin(int(xx,16))将16进制数转换为2进制数,例如bina = bin(int(num,16)) —> 计算出bina的长度,如: length_bina = len(bina) —> 令 WIDTH = 10,为什么是10 ,不是8吗?这里考虑了0b,因此WIDTH = 2 + 8 ,我们最后得出的结构应该是:0bxxxx_xxxx。length_comp = WIDTH - length_bina,通过length_comp我们就可以知道到底该补几个零。 —> bina_new = bina[:2] + length_comp * ‘0’ + bina[2:] 最后得到bina_new便是补位(补零)之后的结果。其中bina[:2] 代表 0b,为什么?这不就是字符创的索引(index)嘛。

部分代码

好了,补零完成了,所有数据都一般长了。贴出部分代码,此代码是实现从一个存有16进制的文件,截取其中的2位16进制数。最后将补零后的结果写入文件。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值