2014-07-19 8 views
5

다음 질문은 bytes 문자열을 사전 키로 사용하고 동등한 것으로 간주되는 바이트 값을 동등한 것으로 취급하지 않았기 때문에 발생했습니다.바이트 리터럴의 파이썬 비교

다음 파이썬 코드가 동일하지 않은 이유는 무엇입니까? 동일한 바이너리 데이터 (이와 같이 endianess를 피하기 위해 의도적으로 선택한 예제)의 동일한 표현이 아닌 이유는 무엇입니까?

int(b'0b11111111', 2) == int(b'0xff', 16) 

왜 파이썬 힘 나를 표현을 알고 않습니다

b'0b11111111' == b'0xff' 

나는 다음은 동등성을 입증, 진정한 평가 알아? 그것은 엔디안과 관련이 있습니까? 다른 방법과 비교할 수있는 쉬운 방법이 있나요? 16 진수 리터럴? 누구든지 (다소) 플랫폼 독립적 인 방식으로 모든 표현 사이를 이동하는 투명하고 명확한 방법을 제안 할 수 있습니까 (아니면 너무 많이 묻는 것입니까?).

편집 : 아래의 코멘트를 감안할 때

, 나는 실제로 인덱스 형태로 b'0b11111111'에 8 비트를 사용하여 사전, 왜 파이썬 10 바이트로 확장 않습니다하고 싶은 말은 내가 어떻게 방지합니까?

이것은 큰 트리 데이터 구조의 작은 부분이며 인덱스 80을 80 배 확대하면 엄청난 메모리 낭비처럼 보입니다.

답변

6

바이트는 수를 나타내는 임의의 수입니다. 파이썬은 바이트가 인코딩 할 수있는 것을 추측 할 수도없고 추측 할 수도 없습니다.

예를 들어, int(b'0b11111111', 34)이고 유효한 해석이지만 해당 해석은 16 진 FF가 아닙니다.

실제로 해석의 수는 무한합니다. 바이트는 일련의 ASCII 코드 포인트 또는 이미지 색상 또는 음표를 나타낼 수 있습니다.

>>> list(bytes(b'0b11111111')) 
[48, 98, 49, 49, 49, 49, 49, 49, 49, 49] 
>>> list(bytes(b'0xff')) 
[48, 120, 102, 102] 
: 명시 적 해석을 적용 할 때까지

, 바이트 객체는 단지 0-255 범위에서 값 시퀀스의, 그 바이트의 텍스트 표현 인쇄 가능한 텍스트로 이렇게 표현할 경우 ASCII를 사용하여 구성되어

이러한 바이트 시퀀스는 동일하지 않습니다.

이러한 시퀀스를 정수 리터럴로 명시 적으로 해석하려면 ast.literal_eval()을 사용하여 의 텍스트 값으로 해석하십시오. 항상 비교하기 전에 먼저 정상화 :

>>> import ast 
>>> ast.literal_eval(b'0b11111111'.decode('utf8')) 
255 
>>> ast.literal_eval(b'0xff'.decode('utf8')) 
255 
+0

그러나 '0b'는 'bytes'리터럴이 어떻게 해석했는지에 관계없이 이진 표현이되도록 의도되어 있지 않음을 나타 냅니까? –

+1

@MatthewHemke : 단지 바이트 값 48과 그 뒤에 바이트 값 98이 있음을 의미합니다.이 값은 ASCII 문자 '0'과 'b'로 해석 가능합니다. –

+0

그렇다면 어떻게하면 바이트 문자열이 정확하게 1 바이트가되는 것입니까? –

4

b'0b11111111' 10 바이트로 구성 : b'0xff' 4 바이트로 구성

In [44]: list(b'0b11111111') 
Out[44]: ['0', 'b', '1', '1', '1', '1', '1', '1', '1', '1'] 

반면 :

In [45]: list(b'0xff') 
Out[45]: ['0', 'x', 'f', 'f'] 

는 분명히, 그들은 같은 개체 수 없습니다.

파이썬 값 explicitness.(명시 적은 암시적인 것보다 우수합니다.b'0b11111111'은 반드시 정수의 2 진 표현이어야합니다. 그것은 단지 바이트 문자열입니다. 해석 방법을 명시 적으로 명시해야합니다.

+0

실제 바이트 문자열은 네. 그러나 그들이 나타내는 데이터는 똑같습니까? 또는 바이트 열 자체가 예를 들어, 바이트 열로 해석 될 때 그 값이된다. 'int ('', base)'평가. –

+0

예, 바이트 문자열은 정수 값과 다릅니다. 'int' 함수는 바이트를'int'로 변환합니다 (그리고 기본은 반드시 지정되어야합니다). – unutbu