문제

나는 정수에 일부 데이터를 저장하고 비트를 처리하는 프로그램을 진행하고 있습니다. 예를 들어, 비트 바이트를 처리 할 숫자 48을받을 수 있습니다. 일반적으로 정수의 엔지니어는 정수의 기계 표현에 달려 있지만, Python은 ints가 항상 Little-Endian임을 보장하기 위해 무엇이든 수행합니까? 아니면 C에서와 같이 Endianness를 확인한 다음 두 경우에 대해 별도의 코드를 작성해야합니까?

내 코드가 Sun Machine에서 실행되기 때문에 묻습니다. 현재 실행중인 코드는 인텔 프로세서를 사용하지만 앞으로 Sun Processor가있는 기계로 전환해야 할 수도 있습니다.

도움이 되었습니까?

해결책

파이썬 int 실행되는 프로세서와 동일한 엔디 니스가 있습니다. 그만큼 struct 모듈에 따라 바이트 블로브를 Ints (및 그 반대로 및 기타 데이터 유형)로 변환 할 수 있습니다. 형식 문자열 선택한 형식을 시작하십시오 @ 또는 네이티브 엔지니어 (및 기본 크기-기타 모든 것은 표준 크기를 사용), '~', '<'for little-endian, '>'또는 '!' 빅 엔디언을 위해.

이것은 비트가 아닌 바이트 바이트입니다. 이 맥락에서 비트 바이트 처리가 의미하는 바를 정확히 잘 모르겠지만, 비슷하게 수용 할 수 있다고 가정합니다.

간단한 경우에 빠른 "벌크"처리하려면 정렬 모듈 - fromstring 그리고 tostring 방법은 많은 바이트에서 빠르게 작동 할 수 있으며 byteswap 메소드는 "다른"엔지니어 (네이티브에 대한 기본 또는 그 반대도 마찬가지)를 얻을 수 있으며 다시 빠르게 그리고 많은 수의 항목 (전체 배열)을 얻을 수 있습니다.

다른 팁

데이터를 '비트로'처리 해야하는 경우 bitstring 모듈이 도움이 될 수 있습니다. 또한 플랫폼 간의 엔디 니스를 다룰 수 있습니다 (최신 트렁크 빌드에서 최소한 며칠 안에 출시 될 예정).

그만큼 struct 기준 치수 플랫폼 간의 엔디 니스를 다루는 가장 좋은 표준 방법입니다. 예를 들어, 이것은 네이티브 엔지니어를 사용하여 정수 1, 2, 3을 2 개의 '반바지'와 1 개의 '긴'(대부분의 플랫폼에서 2 및 4 바이트)으로 풀고 포장합니다.

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)

프로그래밍 방식으로 플랫폼의 엔지니어를 확인하려면 사용할 수 있습니다.

>>> import sys
>>> sys.byteorder

돌아올 것입니다 "big" 또는 "little".

언제 확인?

Bitwise 작업을 수행 할 때 int는 int와 동일한 Endianess를 갖습니다. 확인할 필요가 없습니다. 바이트 시퀀스, 두 언어, Afaik에서 변환 할 때만 이에 대해 관심을 가질 만하면됩니다.

파이썬에서는이를 위해 구조 모듈을 사용하고 가장 일반적으로 struct.pack () 및 struct.unpack ().

다음 스 니펫은 시스템 기본값이 Little Endian인지 알려줍니다 (그렇지 않으면 Big-Endian).

import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)

그러나 이것은 비트 연산자의 동작에 영향을 미치지 않습니다. 1<<1 와 동등하다 2 시스템의 기본 엔지니어에 관계없이.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top