我试图了解如何在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的填充。任何帮助将不胜感激!
答案 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'