这失败了,并不奇怪:
>>> 'abc' << 8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'str' and 'int'
>>>
如果ascii abc
等于011000010110001001100011
或6382179
,是否可以将其移动一些任意数量,以便'abc' << 8
为01100001011000100110001100000000
?< / p>
其他按位操作怎么样? 'abc' & 63
= 100011
等?
答案 0 :(得分:8)
您可能需要的是bitstring模块(请参阅http://code.google.com/p/python-bitstring/)。它似乎支持按位运算以及一些其他位数组操作。但是你应该小心地将字节输入它(例如b'abc'
或bytes('abc')
),而不是字符 - 字符可以包含Unicode并占用多个字节。
答案 1 :(得分:7)
对字符串执行按位运算没有任何意义。您可能希望使用struct
模块将字符串转换为数字:
>>> import struct
>>> x = 'abc'
>>> x = '\x00' * (4-len(x)) + x
>>> number = struct.unpack('!i', x)[0]
>>> number
6382179
然后,您可以在number
上执行所有操作。当(if)你想要一个字符串回来时,你可以struct.pack('!i', number)
。
答案 2 :(得分:2)
我编写了几个函数来将ascii转换为int并仅使用builtins将其转换回来。我可能混淆了MSB / LSB,所以我使用[::-1]
来反转输入字符串。如果您不喜欢订购,请轻松修复。
享受:
>>> intstr = lambda z : ''.join([str(unichr((z & (255*(256**i)))/(256**i))) for i in range(0,((len(bin(z)) - 2) / 8) + (1 if ((len(bin(z)) - 2) / 8) else 0))])
>>> strint = lambda z : reduce(lambda x,y: x | y, [ord(str(z)[i])*((2**8)**i) for i in range(len(str(z)))])
>>> strint('abc'[::-1])
6382179
>>> bin(strint('abc'[::-1]) & 63)
'0b100011'
>>> bin(strint('abc'[::-1]) << 8)
'0b1100001011000100110001100000000'
答案 3 :(得分:0)
使用eval函数获取字符串的输入,然后可以对字符串执行所有按位运算。
> t ="1|0"
eval(t)
output: 1