关于python进制与字符转换的问题研究
来源:互联网 发布:手机装潢设计软件 编辑:程序博客网 时间:2024/04/29 16:38
问题背景 - 源于一次作业
作业
编程统计DES算法中明文(或密钥)改变1位,2位。。。64位的情况下,密文位数的变化量情况具体要求: 编程实现
1. 在密钥不变情况下,明文改变1位,2位。。。64位,观察并统计密文位数变化规律。
2. 在明文不变情况下,密钥改变1位,2位。。。64(56)位,观察并统计密文位数变化规律。
为了使统计具有客观性,上述每种情况可以重复多次,然后求平均值。
问题
使用pyDes库进行编程,但该库中输入的原文与密钥是以字节(Byte)的单位的,而作业要求是改变位(bit)。想到用字节与进制间的转换解决该问题。于是有了关于题目的研究。
实际研究
查了这么多资料,似乎字符串是很少一步转换成2进制的。要用16进制在中间桥接。即转换过程为:字符<->16进制<->2进制。
字符 <-> 16进制
首先可以学习 binascii 这个库。这个库是用于进制与ASCII之间的转换。
我主要用到以下两个方法:binascii.hexlify(data) // 字符串<->16进制(还是字符串)
举个粟子:binascii.unhexlify(hexstr) // 就是把上面的一串16进制的字符串变回字符形式
系统学习binascii -> python手册大法
16 <-> 2进制
这里学习python的进制转换。可以发挥你的想像力各种bin、hex、int、chr、ord天花乱坠地嵌套使用吧。
粟子:(图片中代码有错,正确的是bin(int(hex_data,16))
)右侧学习链接强推 -> 字符转换为二进制及进制之间转换
但使用上述进制转换方法要注意开头的前缀是否你所需要的,如这里的‘0b’,在我的编程中是多余的,所以要去掉。你可以使用切片等方法。这里推荐一个format的用法。
补充
当然实际还有很多方法可以解决进制与字符串转换的问题。我使用的只是其中一种,而且也还挺复杂的。但已经比我最初想的好了!
此外,在查资料学习的过程中,看到了一个直接转换的很溜的思想。在此补充给大家。
【下面代码节选自 -> C语言实现DES算法】
/*------------------------------- 字节转换成位函数 每8次换一个字节 每次向右移一位 和1与取最后一位 共64位 --------------------------------*/void ByteToBit(bool *DatOut,char *DatIn,int Num) // OK{ int i=0; for(i=0;i< Num;i++) { DatOut[i]=(DatIn[i/8]>>(i%8))&0x01; } }/*------------------------------- 位转换成字节函数 字节数组每8次移一位 位每次向左移 与上一次或 ---------------------------------*/void BitToByte(char *DatOut,bool *DatIn,int Num) // OK{ int i=0; for(i=0;i<(Num/8);i++) { DatOut[i]=0; } for(i=0;i< Num;i++) { DatOut[i/8]|=DatIn[i]<<(i%8); } }
-
总结
>
- 字符串<->16进制<->2进制
- 位运算
- pydes 、binascii 库的学习
- 进制间的转换命令
其他细节
附:py
- 关于python进制与字符转换的问题研究
- 关于转义字符和编码转换函数的研究
- 关于php内部编码与mysql字符差异问题的研究
- 关于php内部编码与mysql字符差异问题的研究
- 关于PHP内部编码与mysql字符差异问题的研究
- 关于PHP内部编码与mysql字符差异问题的研究
- 关于String字符转换的问题
- Python字符与数字的相互转换
- Python字符与数字的相互转换
- Python字符与数字的相互转换
- python中字符与数字的转换
- python-ASCII与字符间的转换
- Python数字与字符之间的转换
- 关于数字与数字数组与字符型数字数组的转换问题
- Java字符与整形的转换问题
- 20110831日的总结--关于原始流与字符流之间的转换中的设计问题
- Python中的字符串与字符编码:编码和转换问题
- Python中的字符串与字符编码:编码和转换问题
- XML 之解析sax(2) 解析到一个对象中
- android中Button,ImageButton和ToggleButton
- 《Residual Networks Behave Like Ensembles of Relatively Shallow Networks》笔记
- SpringMVC使用ajax返回json
- 博客第一天
- 关于python进制与字符转换的问题研究
- java菜鸟的回炉之旅之八---运算符二和控制语句一
- Git 的 .gitignore 配置
- 导出100万条数据到excel
- 使用docker部署ss-panel
- 婴儿防盗定位
- Parentheses Sequence微软编程笔试
- 第一次使用intelliJ 发现found duplicate code黄色警告
- 一步一步学MySQL----16 多表数据记录查询之子查询