Python二进制字符串移位

时间:2016-10-29 07:09:25

标签: python bit-shift

我正在研究Python中的DES算法。

在Fiestle函数之一的函数中,我必须使用XOR元素来获取密码。

有什么方法可以在python中执行转换操作,下面是我试过的代码:

C0是1111000011001100101010101111

D0是0101010101100110011110001111

c0_d0=[]
for i in range(1):
    t=[]
    t.append(C0)
    t.append(D0)
    c0_d0.append(t)

#print c0_d0 

def str_to_bin(strr,shifts):
for i in range(1,17):
    temp=[]
    for j in range(1):
        temp.append(int(c0_d0[i-1][0])<<1)
        temp.append(int(c0_d0[i-1][1])<<1)
    c0_d0.append(temp)

return c0_d0

我得到的输出是:enter image description here

我希望元素是通过移位来获得的二进制字符串。第一个元素对是通过移位前一个元素对获得的,下一个元素对是通过前一个元素获得的,依此类推。只给出了第0个索引元素。

实施例 C0是1111000011001100101010101111 D0是0101010101100110011110001111

C1应为C0 <&lt;&lt; 1,等于1110000110011001010101011110

D1应为D0&lt;&lt; 1,等于1010101011001100111100011110

2 个答案:

答案 0 :(得分:1)

尝试不使用十进制或字符串编码的二进制文件;使用数字的效率和一致性要高得多,Python支持将它们转换为其他基础或从其他基础转换。

>>> C0=0b1111000011001100101010101111
>>> bin(C0<<1)
'0b11110000110011001010101011110'

你想在某些时候限制你的大小,因为Python支持任意大的整数(在Python 2中称为long,这是你的输出中的L来源,或者只是Python中的int 3)。这通常通过位掩码来完成。如果要在特定基础中显示结果,也可以使用特定宽度进行格式设置。

>>> bin(C0 & ((1<<16)-1))  # truncate to 16 bits
'0b1100101010101111'
>>> '{:032b}'.format(C0)   # format as 32 digit binary string
'00001111000011001100101010101111'

特别不切实际的是,您的示例输出混合了字符串和数字形式的数据。

以下是如何从字符串中解析二进制文件的示例,以防您的程序将其作为输入接收,以及更直接的格式化方法。

>>> D = int('0101010101100110011110001111', 2)  # parse as binary = base 2
>>> D
89548687
>>> format(D, '032b')
'00000101010101100110011110001111'

答案 1 :(得分:0)

你对左移的定义不是标准的(乘以2)。您可以使用字符串轻松模拟:

C = '1111000011001100101010101111'
D = '0101010101100110011110001111'

def shstr(string):
    return string[1:]+'0'

zeroes = ''.join(['0' for _ in range(len(C))])
while C != zeroes or D != zeroes:
    print C,D
    C = shstr(C)
    D = shstr(D)

或者把它放到一个函数中并且产生。