在Python中使用十六进制进行位移

时间:2014-11-25 13:31:28

标签: c# python

我试图了解如何在Python中执行位移操作。来自C#,它不会以相同的方式工作。

C#代码是;

var plain=0xabcdef0000000; // plaintext
var key=0xf0f0f0f0f123456; // encryption key

var L = plain;
var R = plain>>32;

输出是;

000abcdef0000000 00000000000abcde

Python中的等效项是什么?我试过了;

plain = 0xabcdef0000000
key = 0xf0f0f0f0f123456

print plain

left  = plain
right = plain >> 32

print hex(left)
print hex(right)

然而,它不起作用。 Python中的输出不同。缺少0的填充。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

hex()函数不会使用前导零填充数字,因为Python整数是无界。 C#整数具有固定大小(在这种情况下为64位),因此具有上限,因此可以填充。这并不意味着那些额外的填充零带有任何意义;整数值是相同的

您必须使用format()函数显式添加这些零来生成输出:

print format(left, '#018x')
print format(right, '#018x')

#告诉format()包含0x前缀,并且字段宽度前面的前导0要求format()填充输出:

>>> print format(left, '#018x')
0x000abcdef0000000
>>> print format(right, '#018x')
0x0000000000abcde

请注意,宽度包含0x前缀;该输出中有16个十六进制数字,表示64位数据。

如果您想根据key中使用的字符数使用动态宽度,请从int.bit_length()计算出来;每4位产生一个十六进制字符:

format(right, '#0{}x'.format((key.bit_length() + 3) // 4 + 2))

演示:

>>> (key.bit_length() + 3) // 4 + 2
17
>>> print format(right, '#0{}x'.format((key.bit_length() + 3) // 4 + 2))
0x0000000000abcde

但请注意,即使密钥长度只有60位,C#也会用0填充该值。

答案 1 :(得分:1)

In [83]: plain=0xabcdef0000000    

In [84]: plain>>32
Out[84]: 703710

In [85]: plain
Out[85]: 3022415462400000

In [87]: hex(plain)
Out[87]: '0xabcdef0000000'

如果

In [134]: left  = plain
In [135]: right = plain >> 32

然后

In [140]: '{:0x}'.format(left)
Out[140]: 'abcdef0000000'

In [143]: '{:018x}'.format(right)
Out[143]: '0000000000000abcde'

答案 2 :(得分:0)

我试过你没问题

>>> hex(0xabcdef0000000)
'0xabcdef0000000'

>>> hex(0xabcdef0000000 >> 32)
'0xabcde'