2014-11-25 2 views
-1

파이썬에서 비트 시프트 연산을 수행하는 방법을 이해하려고합니다. C#에서 오는 것과 같은 방식으로 작동하지 않습니다.파이썬에서 16 진수로 비트 시프트

C# 코드는 다음과 같습니다.

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

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

출력은 다음과 같습니다.

000abcdef0000000 00000000000abcde 

파이썬에서 equivilent 란 무엇입니까? 나는 노력했다.

plain = 0xabcdef0000000 
key = 0xf0f0f0f0f123456 

print plain 

left = plain 
right = plain >> 32 

print hex(left) 
print hex(right) 

그러나 작동하지 않습니다. 결과는 파이썬에서 다릅니다. 0의 패딩이 없습니다. 어떤 도움을 주시면 감사하겠습니다!

+2

정확히 "작동하지 않는다"는 것을 의미합니까? – ch3ka

+0

파이썬 버전에서 동일한 출력을 얻지 못했습니다. 패딩 된 0이 없습니다. –

+0

하지만'0x00000000000abcde == 0xabcde'라는 것을 알고 있습니까? 어쨌든, 인쇄를 위해, '문자열 포맷팅'이 트릭을 할 것입니다. – ch3ka

답변

2

hex() 기능의 경우 때문에, 0이 붙는되지 패드 번호를 않습니다 파이썬 응원 자들은 무한대입니다. C# 정수는 고정 된 크기 (이 경우 64 비트)를 가지므로 상한선을 가지므로 패딩 될 수 있습니다. 이것은 여분의 패딩 0이 의미를 지니고 있다는 것을 의미하지는 않습니다. 정수 값 은 같음입니다.

당신은 명시 적으로 출력을 생성하는 format() 기능을 사용하여, 그 0을 추가해야

다음 #0x 접두사를 포함 format()을 알려줍니다

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

및 필드 폭이 format()을 요청하기 전에 최고의 0을 출력을 채 웁니다.

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

접두어는 0x입니다. 64 비트의 데이터를 나타내는 16 진수가 출력에 있습니다.

key에 사용 된 문자 수를 기준으로 동적 너비를 사용하려면 int.bit_length()에서 계산합니다.

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

데모 : 매 4 비트 헥스 캐릭터 생성

>>> (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 코드를 업데이트했습니다. –