2012-02-02 1 views
4

바이너리 데이터 구문 분석을 위해이 작은 패키지 "construct"을 사용하고 있습니다.정렬되지 않은 int 필드에 대한 구문 분석을 생성 하시겠습니까?

31  24 23    0 
+-------------------------+ 
| status | an int number | 
+-------------------------+ 

기본적 상위 8 비트의 상태에 대해 사용되며, 3 바이트 정수 왼쪽 : 상위 비트와 INT 타입 오프 마스크 형식으로 정의된다 그러나, I는 경우에 부딪쳤다. 내가 저장 BitStruct을 사용할 수 있습니다 어쨌든

  • 무력 방법 ULInt32로 정의하고 자신에게
  • 마스킹 비트를하는 것입니다 있나요 : 나는 조금 형식을 정의하는 적절한 방법이 무엇인지에 손실입니다 수고?

    sample = "\xff\x01\x01\x01" 
    c = BitStruct("foo", BitField("i", 24, swapped=True), BitField("status", 8)) 
    c.parse(sample) 
    Container({'i': 66047, 'status': 1}) 
    

    감사

    을 : 리틀 엔디안 및 jterrace의 예를 기반으로 교체 = 진정한 제안을 가정

편집

, 나는이 내 경우에 작동합니다 어떤 생각 올리버

+1

? 'val >> 24'와'val & 0xfff'는 꽤 잘 읽을 수 있습니다. –

+0

@ Anony-Mousse 나는 그렇게 단순하지 않다고 생각합니다. 이것은 구조체 또는 배열 내부에있을 수 있으며, 이미 구조를 사용하여 해당 데이터 구조를 구문 분석합니다. – jterrace

답변

2

구조체에 Int24 형식이 포함되어 있으면 쉽게 처리 할 수 ​​있지만 그렇지 않습니다.

>>> from construct import BitStruct, BitField 
>>> sample = "\xff\x01\x01\x01" 
>>> c = BitStruct("foo", BitField("status", 8), BitField("i", 24)) 
>>> c.parse(sample) 
Container({'status': 255, 'i': 65793}) 

주 : 대신 비트는 다음과 같이 자신을 길이를 지정할 수있는 값을 \x01\x01\x01입니다 낮은 수준의 정수에 정의 된 형식 정수 연산을 사용하여 뭐가 문제 65536 + 256 + 1 = 65793

+0

"\ xff \ x01 \ x01 \ x01"이라고 쓸 때 비트 순서대로 어딘가에 혼란 스럽습니다. \ xff 높은 바이트? [24-32]? 웬일인지, 나는 항상 이것이 24 비트, 8 비트 순서로되어야한다고 생각했다. 그러나 두 가지 대답이 그렇게 정의 되었기 때문에 나는 그것을 뒤로 가져 왔다고 생각하고 있습니다. 분명히 할 수 있습니까? 감사합니다 – Oliver

+0

@Oliver 그것은 빅 엔디안 또는 리틀 엔디안 여부에 달려 있습니다. 데이터의 형식은 무엇입니까? 바이트 문자열 중 하나의 예제를 줄 수 있습니까? – jterrace

+0

확실히 리틀 엔디안을 사용하고 있음을 알고 있지만 예를 들어 특정 바이트 문자열이 없습니다. 나는 약간의 테스트를했는데, \ xff는 비트 0-7에 속한 것 같습니다. – Oliver

0
BitStruct("foo", 
      BitField("status", 8), 
      BitField("number", 24)) 
+0

BitField (24)가 먼저 오도록 순서를 바꿔야합니까? thanks – Oliver

+0

jterrace와 논의한 바와 같이, 이것은 하이 - 엔디안을 가정합니다. 필드의 순서를 바꾸면 24 비트 필드의 값이 여전히 반전되기 때문에 도움이되지 않습니다. –

+0

@ RicardoCárdenes @ RicardoCárdenes swapped = True로 바꾸어야합니다. – jterrace