Python에는 비트 필드 유형이 있습니까?
-
02-07-2019 - |
문제
부울 배열의 소형 표현이 필요합니다. Python은 내장 비트 필드 유형을 가지고 있습니까? 아니면 대체 솔루션을 찾아야합니까?
해결책
Bitarray 내가 최근에 비슷한 필요를 가졌을 때 내가 찾은 최고의 대답이었습니다. 그것은 C 확장자 (Bitvector보다 훨씬 빠르고, 순수한 파이썬) 데이터를 실제 비트 필드에 저장합니다 (따라서 요소 당 바이트를 사용하는 것으로 보이는 Numpy 부울 어레이보다 메모리가 8 배 더 높습니다.)
다른 팁
주로 비트 필드의 이름을 지정하고 쉽게 조작하려면 통신 프로토콜에서 단일 비트로 표시되는 플래그로 작업하려면 표준 구조 및 Union 기능을 사용할 수 있습니다. ctypes, 설명대로 Python에서 CType Structure + Union을 올바르게 선언하는 방법은 무엇입니까? - 스택 오버플로
예를 들어, 4 바이트의 4 가지 비트 비트를 개별적으로 작업하려면 작은 엔진 구조에서 최소한에서 가장 중요한 이름으로 이름을 지정하십시오. 조합을 사용하여 바이트 또는 INT와 동일한 데이터에 대한 액세스를 제공하여 데이터를 통신 프로토콜 안팎으로 이동할 수 있습니다. 이 경우에는이 경우에 수행됩니다 flags.asbyte
필드:
import ctypes
c_uint8 = ctypes.c_uint8
class Flags_bits(ctypes.LittleEndianStructure):
_fields_ = [
("logout", c_uint8, 1),
("userswitch", c_uint8, 1),
("suspend", c_uint8, 1),
("idle", c_uint8, 1),
]
class Flags(ctypes.Union):
_fields_ = [("b", Flags_bits),
("asbyte", c_uint8)]
flags = Flags()
flags.asbyte = 0xc
print(flags.b.idle)
print(flags.b.suspend)
print(flags.b.userswitch)
print(flags.b.logout)
4 개의 비트 (여기에서 가장 중요한 것으로부터 인쇄했는데, 인쇄 할 때 더 자연스럽게 보이는)는 이진에서 1, 1, 0, 0, 즉 0xc입니다.
당신은 비트 스트링 최근 버전 2.0에 도달 한 모듈. 이진 데이터는 바이트 어레이로 소형 저장되며 쉽게 생성, 수정 및 분석 할 수 있습니다.
당신은 만들 수 있습니다 BitString
바이너리, 옥탈, 16 진수, 정수 (큰 또는 작은 엔디 언), 문자열, 바이트, 부유물, 파일 등의 물체.
a = BitString('0xed44')
b = BitString('0b11010010')
c = BitString(int=100, length=14)
d = BitString('uintle:16=55, 0b110, 0o34')
e = BitString(bytes='hello')
f = pack('<2H, bin:3', 5, 17, '001')
그런 다음 간단한 기능 또는 슬라이스 표기법으로 분석하고 수정할 수 있습니다. 비트 마스크 등에 대해 걱정할 필요가 없습니다.
a.prepend('0b110')
if '0b11' in b:
c.reverse()
g = a.join([b, d, e])
g.replace('0b101', '0x3400ee1')
if g[14]:
del g[14:17]
else:
g[55:58] = 'uint:11=33, int:9=-1'
비트 위치의 개념도 있으므로 파일이나 스트림처럼 취급 할 수 있습니다. 속성은 비트 데이터에 대한 다른 해석을 제공하는 데 사용됩니다.
w = g.read(10).uint
x, y, z = g.readlist('int:4, int:4, hex:32')
if g.peek(8) == '0x00':
g.pos += 10
또한 표준 비트 와이드 바이너리 연산자, 포장, 포장 풀기, 엔디 니스 등을 지원합니다. 최신 버전은 Python 2.7 및 3.X 용이며, 순수한 파이썬이지만 메모리와 속도 측면에서 합리적으로 잘 최적화됩니다.
이진 비트 측면 연산자!, &, |, ^, >> 및 <<. 그것들은 실제로 잘 작동하며 기본 C에서 직접 구현되며, 일반적으로 기본 하드웨어에 직접적으로 이루어집니다.
각 값을 두 가지의 힘으로 표시하십시오.
testA = 2**0
testB = 2**1
testC = 2**3
그런 다음 값을 설정하려면 :
table = table | testB
허위를 설정하려면 :
table = table & (~testC)
값을 테스트하려면 :
bitfield_length = 0xff
if ((table & testB & bitfield_length) != 0):
print "Field B set"
이것이 당신에게 의미가 없다면 16 진수 표현에 대해 조금 더 깊이 파고 들으십시오. 이것은 기본적으로 임베디드 C 응용 프로그램에서 부울 플래그를 추적하는 방법입니다 (메모리를 제한 한 경우).
비트 벡터 패키지는 필요한 것일 수 있습니다. 파이썬 설치에 내장되어 있지 않지만 파이썬 사이트에서 쉽게 추적 할 수 있습니다.
https://pypi.python.org/pypi/bitvector 현재 버전의 경우.
Numpy는 a 배열 인터페이스 비트 필드를 만드는 데 사용할 수있는 모듈.
ints (또는 Long Ints)를 사용하여 BOOL의 배열 (또는 정수 세트)으로 표시하려면 살펴보십시오. http://sourceforge.net/projects/pybitop/files/
비트 필드의 삽입/추출물을 긴 INT로 제공합니다. 가장 중요하거나 가장 중요하지 않은 '1'비트를 찾는 것; 모든 1을 계산; 비트 반전; 순수한 파이썬에서는 모두 가능하지만 C에서는 훨씬 빠릅니다.
대부분 이루어지는 비트가 있습니다 https://pypi.org/project/range_set/ Python의 내장과 호환되는 API 모듈 set
. 이름에서 알 수 있듯이 비트를 시작/종료 쌍으로 저장합니다.