关于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进制。

  1. 字符 <-> 16进制
    首先可以学习 binascii 这个库。这个库是用于进制与ASCII之间的转换。
    我主要用到以下两个方法:

    binascii.hexlify(data) // 字符串<->16进制(还是字符串)
    举个粟子:
    这里写图片描述

    binascii.unhexlify(hexstr) // 就是把上面的一串16进制的字符串变回字符形式

    系统学习binascii -> python手册大法

  2. 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);        }        }

-

总结
>

  1. 字符串<->16进制<->2进制
  2. 位运算
  3. pydes 、binascii 库的学习
  4. 进制间的转换命令
  5. 其他细节

    附:py

0 0
原创粉丝点击