Python 二进制字符串移位
Python binary string shift
我正在 Python 中研究 DES 算法。
在其中一个函数中,即 Fiestle 函数,我必须对元素进行异或运算才能得到密码。
有什么方法可以在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
我得到的输出是这样的:
我希望元素是通过移位获得的二进制字符串 bits.That 是第一个元素对是通过移动前一个元素对获得的,下一个元素对是通过前一个元素获得的,所以 on.Only给出第 0 个索引元素。
例子
C0 是 1111000011001100101010101111
D0 是 0101010101100110011110001111
C1 应该是 C0<<1 等于 1110000110011001010101011110
D1 应该是 D0<<1 等于 1010101011001100111100011110
尽量不要使用十进制或字符串编码的二进制;按原样使用数字更加有效和一致,并且 Python 支持将它们转换为其他基数或从其他基数转换。
>>> C0=0b1111000011001100101010101111
>>> bin(C0<<1)
'0b11110000110011001010101011110'
虽然在某些时候你会想要限制你的大小,因为 Python 支持任意大的整数(在 Python 2 中称为 long
,这是 L来自您的输出,或者只是 int
in Python 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'
我正在 Python 中研究 DES 算法。
在其中一个函数中,即 Fiestle 函数,我必须对元素进行异或运算才能得到密码。
有什么方法可以在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
我得到的输出是这样的:
我希望元素是通过移位获得的二进制字符串 bits.That 是第一个元素对是通过移动前一个元素对获得的,下一个元素对是通过前一个元素获得的,所以 on.Only给出第 0 个索引元素。
例子 C0 是 1111000011001100101010101111 D0 是 0101010101100110011110001111
C1 应该是 C0<<1 等于 1110000110011001010101011110
D1 应该是 D0<<1 等于 1010101011001100111100011110
尽量不要使用十进制或字符串编码的二进制;按原样使用数字更加有效和一致,并且 Python 支持将它们转换为其他基数或从其他基数转换。
>>> C0=0b1111000011001100101010101111
>>> bin(C0<<1)
'0b11110000110011001010101011110'
虽然在某些时候你会想要限制你的大小,因为 Python 支持任意大的整数(在 Python 2 中称为 long
,这是 L来自您的输出,或者只是 int
in Python 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'