2011-04-18 80 views
0

ActionScript和javascript支持'>>>'运算符。我正在使用python转换base64编码/解码的动作。我知道base64是可用的,这是为了学习的目的。 python没有“...”运算符。 base64 action script>>>运算符在python中

在解码功能

你有两行

  1. O1 =比特>>> 16 & 0xff的;
  2. o2 = bits >>> 8 & 0xff;

如何将这些行转换为python?

+2

运算符*做了什么*?算术右移? (像'>>>'这样的东西很难Google,所以请*注明*)。 – 2011-04-18 12:08:34

+0

btw。如果你需要Python中的AES,只需使用PyCrypto包。 http://pycrypto.org/ – vartec 2011-04-18 12:14:28

+0

这是一个算术右移(ASR),而不是逻辑右移(LSR)。我仍然希望其中一种语言能够实现旋转指令(ROL和ROR),但是这些指令依赖于确切的位数,并且一些处理器可以让您通过进位位进行旋转,因此会变得杂乱无章。哦,顺便说一句,只要'bits'长度至少为24位,'bits >>> 16&0xff'和'bits >> 16&0xff'是同样的事情,因为'&'运算符执行掩码。另一个等式也一样。在英文中,这些等式仅从较大的整数字段中提取单个字节。 – 2011-04-18 12:20:29

回答

0
import ctypes 
#convert signed to unsigned 
bits = ctypes.c_uint32(bits).value 

o1 = bits >> 16 & 0xff 
o2 = bits >> 8 & 0xff 
+0

运算符'>>'在JavaScript中执行与>>>不同的操作,在这种情况下差异很重要。 – 2011-04-18 12:12:42

3

IINM,>>>是一个右移,保留最左边的位的值。这具有保持数字的符号完整的效果(即,负数插入1作为他们的MSB而不是0)。

在Python中,整数可以是任意大的。由于位数不受限制,所以没有有意义的最重要的概念。因此,右移只需将所有位向右移动并保留符号。因此,在Python中,您可以使用>>

编辑:

由于@Sven Marnach已经指出的那样,>>>操作做什么,我认为它在Javascript做的正好相反。因此>>>不保留符号,而>>似乎这样做。另一个有趣的事实是,在Javascript中显然-1>>1-1而不是0。不用说,我对JavaScript的了解非常有限,我不确定这些运算符在Python中的确切等效性。

一个选项可能是明确限制正在使用的位数(可能使用ctypes.c_int),然后在用户定义的右移功能中根据需要手动设置最左边的位。

+0

这是不正确的。 '>>>'does * not * preserve sign:尝试'javascript:alert(-3 >>> 1);' – 2011-04-18 12:31:35

+0

@Sven Marnach:谢谢。我已经更新了答案。 – MAK 2011-04-18 13:21:12