2014-11-25 20 views
-1

我想了解如何在Python中執行位移操作。來自C#,它不以相同的方式工作。在Python中使用十六進制進行位移

C#代碼是;

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

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

輸出是;

000abcdef0000000 00000000000abcde 

什麼是Python中的equivilent?我努力了;

plain = 0xabcdef0000000 
key = 0xf0f0f0f0f123456 

print plain 

left = plain 
right = plain >> 32 

print hex(left) 
print hex(right) 

但是,它不起作用。 Python中的輸出是不同的。 0的填充缺失。任何幫助,將不勝感激!

+2

什麼意思是「它不工作」? – ch3ka 2014-11-25 13:32:36

+0

我沒有得到與Python版本相同的輸出。填充的0缺失。 – 2014-11-25 13:40:37

+0

但你知道'0x00000000000abcde == 0xabcde',對嗎?無論如何,對於打印,'字符串格式化'將做到這一點。 – ch3ka 2014-11-25 13:43:11

回答

2

hex()功能不帶前導零鍵盤的數字,因爲Python中泰格爾是無界。 C#整數的大小是固定的(在這種情況下是64位),所以有一個上限,可以填充。這並不意味着這些額外的填充零帶有任何意義;整數值相同。

你必須明確地添加這些零,使用format()函數產生的輸出:

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

#告訴format()到包括0x前綴,字段寬度要求format()前面有0填充輸出:

>>> 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 

但是請注意,即使是密鑰的長度和C#只有60比特將墊,其與0值好。

0

我有你沒有問題,你試過

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

>>> hex(0xabcdef0000000 >> 32) 
'0xabcde' 
0
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' 
+0

@ PM2Ring我更新了代碼。 – 2014-11-25 14:18:19