byte revertir AB CD a CD AB con python

Tengo un archivo .bin y quiero simplemente revertir los datos hexadecimales. Digamos, por ejemplo, @ 0x10 que lee AD DE DE C0, quiero que lea DE AD C0 DE.

Sé que hay una forma sencilla de hacer esto, pero soy principiante y solo estoy aprendiendo python y estoy tratando de hacer algunos progtwigs simples para ayudarme en mis tareas diarias. Me gustaría convertir todo el archivo de esta manera, no solo 0x10.

Estaré convirtiendo al inicio de desplazamiento 0x000000 y el tamaño de bloque / longitud es 1000000.

Aquí está mi código, tal vez puedas decirme qué hacer. Estoy seguro de que simplemente no lo entiendo, y soy nuevo en progtwigción y Python. Si pudieras ayudarme, te lo agradecería mucho.

def main(): infile = open("file.bin", "rb") new_pos = int("0x000000", 16) chunk = int("1000000", 16) data = infile.read(chunk) reverse(data) def reverse(data): output(data) def output(data): with open("reversed", "wb") as outfile: outfile.write(data) main() 

y puede ver el módulo para invertir, he intentado muchas sugerencias diferentes y o bien pasará el archivo intacto o generará errores. Sé que el módulo de reversa está vacío ahora, pero he intentado todo tipo de cosas. Solo necesito el módulo inverso para convertir AB CD a CD AB. gracias por cualquier entrada

EDIT: el archivo es de 16 MB y quiero invertir el orden de bytes de todo el archivo.

En Python 2, el archivo binario se lee como una cadena, por lo que el corte de cadenas debería manejar fácilmente el intercambio de bytes adyacentes:

 >>> original = '\xAD\xDE\xDE\xC0' >>> ''.join([c for t in zip(original[1::2], original[::2]) for c in t]) '\xde\xad\xc0\xde' 

En Python 3, el archivo binario se lee como bytes. Solo se necesita una pequeña modificación para construir otra matriz de bytes:

 >>> original = b'\xAD\xDE\xDE\xC0' >>> bytes([c for t in zip(original[1::2], original[::2]) for c in t]) b'\xde\xad\xc0\xde' 

También puede usar los códigos de formato < y > endianess en el módulo de estructura para lograr el mismo resultado:

 >>> struct.pack('<2h', *struct.unpack('>2h', original)) '\xde\xad\xc0\xde' 

Feliz intercambio de bytes 🙂

En Python 3.4 puedes usar esto:

 >>> data = b'\xAD\xDE\xDE\xC0' >>> swap_data = bytearray(data) >>> swap_data.reverse() 

el resultado es

 bytearray(b'\xc0\xde\xde\xad') 
 data = b'\xAD\xDE\xDE\xC0' reversed_data = data[::-1] print(reversed_data) # b'\xc0\xde\xde\xad' 

Python tiene un operador de lista para invertir los valores de una lista -> nameOfList [:: – 1]

Por lo tanto, podría almacenar los valores hexadecimales como una cadena y colocarlos en una lista y luego intentar algo como:

 def reverseList(aList): rev = aList[::-1] outString = "" for el in rev: outString += el + " " return outString