2013-06-08 2 views
1

Я новичок в python и занимаюсь встроенной работой (большая часть моего опыта программирования использовала C).Как изменить порядок байтов в байтах в Python?

Я читаю четырехбайтовый поплавок в байтарий из последовательного порта, но вместо нормального младшего порядка DCBA он кодируется как CDAB. Или он может быть закодирован как BADC. (где A - старший байт, а D - LSB). Каков правильный способ обхода байтов в байтах?

К примеру, у меня есть

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

Я хочу, чтобы иметь возможность произвольно расположить байты в TMP, а затем распаковать() его обратно в поплавок.

Такие вещи кажутся существенными при выполнении чего-либо, связанного со встроенными системами, но либо я ошибаюсь, либо нет четкого ответа (пока!).

редактировать: уверен, что я могу сделать это:

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

да, но я хочу, чтобы произвольно изменять порядок байтов. Мой вопрос не в том, что касается судьбы. Конкретным приложением здесь является получение данных с устройства Modbus, которое хранит данные только по 2 байта за раз, а порядок 2-байтных слов в отношении сохраненных данных не задан и должен быть настраиваемым пользователем. если big-endian - ABCD, а маленький endian - DCBA, я спрашиваю о правильном способе обработки таких случаев, как CDAB и BADC. – Dmitri

+0

Обновлено. Это поможет получить реальный пример необработанных данных и то, что вы хотите получить. –

+0

Спасибо! Мне было интересно, как это назвать, swizzling кажется идеальным словом xD – Dmitri

Смежные вопросы