2013-06-08 3 views
1

저는 파이썬에 익숙하지 않고 임베디드 관련 작업을하고 있습니다 (대부분의 프로그래밍 경험은 C를 사용하고 있습니다).파이썬에서 Bytearray의 바이트를 어떻게 재정렬합니까?

직렬 포트에서 bytearray로 4 바이트 플로트를 읽고 있지만 보통의 리틀 엔디 언 주문 DCBA 대신 CDAB로 인코딩됩니다. 또는 BADC로 인코딩 될 수 있습니다. (여기서 A는 최상위 바이트이고 D는 LSB 임). bytearray에서 바이트를 바꿔 쓰는 올바른 방법은 무엇입니까?

예를 들어, 나는

tmp=bytearray(pack("f",3.14)) 

내가 다시 플로트로)을 임의의 tmp에 바이트를 마련하고 (압축 해제 할 수 있도록하려는있다.

임베디드 시스템과 관련된 모든 작업을 수행 할 때 필수적인 것처럼 보이지만 잘못되거나 확실하지 않은 대답이 있습니다 (아직!).

편집 : - CONCATENATE 다시 내가 슬라이스와 수 있도록하고 싶습니다, 이상적으로 ...

from struct import * 

def modswap(num): 

    tmp=bytearray(pack("f",num)) 
    res=bytearray() 
    res.append(tmp[2]) 
    res.append(tmp[3]) 
    res.append(tmp[0]) 
    res.append(tmp[1]) 
    return unpack('f',res) 


def main(): 
    print(modswap(3.14)) 

을하지만, 더 나은 방법이 있어야한다 : 확실히,이 작업을 수행 할 수 있습니다 나는 제발, 또는 가능한 한 한 번에 슬라이스를 교체하십시오.

답변

1

당신은 한 번에 스위 즐링 (swizzle) 할 수 있습니다

from struct import pack,unpack 

def modswap(num): 
    tmp=bytearray(pack("f",num)) 
    tmp[0],tmp[1],tmp[2],tmp[3] = tmp[2],tmp[3],tmp[0],tmp[1] 
    return unpack('f',tmp) 

당신은 바이트 배열의 조각을 수정할 수 있습니다

>>> data = bytearray(b'') 
>>> data[3:7] = data[5],data[6],data[3],data[4] 
>>> data 
bytearray(b'0125634789') 
+0

네,하지만 임의로에 다시 순서 바이트를 원하는. 내 질문은 엔디안에 관한 것이 아닙니다. 여기서 특정 어플리케이션은 데이터를 한 번에 2 바이트 만 저장하는 Modbus 장치에서 데이터를 가져 오는 것이며 저장되는 데이터와 관련하여 2 바이트 단어의 순서는 지정되지 않으며 사용자가 구성 할 수 있어야합니다. 빅 엔디안이 ABCD이고 리틀 엔디안이 DCBA 인 경우 CDAB 및 BADC와 같은 사례를 처리하는 적절한 방법을 묻습니다. – Dmitri

+0

실제 원시 데이터 예제와 결과를 원하는 데 도움이됩니다. –

+0

고마워요! 나는 그것을 무엇이라고 부르는 지 궁금해서, swizzling은 완벽한 단어 xD처럼 보인다. – Dmitri