您的位置:首页 > 编程语言 > Python开发

关于python进制与字符转换的问题研究

2017-03-31 23:16 295 查看

问题背景 - 源于一次作业

作业

编程统计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