Daniel Schwierzeck | a1abae7 | 2020-06-06 22:21:47 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # SPDX-License-Identifier: GPL-2.0+ |
| 3 | |
| 4 | """ |
| 5 | Simple tool to swap the byte endianness of a binary file. |
| 6 | """ |
| 7 | |
| 8 | import argparse |
| 9 | import io |
| 10 | |
| 11 | def parse_args(): |
| 12 | """Parse command line arguments.""" |
| 13 | description = "Swap endianness of given input binary and write to output binary." |
| 14 | |
| 15 | parser = argparse.ArgumentParser(description=description) |
| 16 | parser.add_argument("input_bin", type=str, help="input binary") |
| 17 | parser.add_argument("output_bin", type=str, help="output binary") |
| 18 | parser.add_argument("-c", action="store", dest="chunk_size", type=int, |
| 19 | default=io.DEFAULT_BUFFER_SIZE, help="chunk size for reading") |
| 20 | |
| 21 | return parser.parse_args() |
| 22 | |
| 23 | def swap_chunk(chunk_orig): |
| 24 | """Swap byte endianness of the given chunk. |
| 25 | |
| 26 | Returns: |
| 27 | swapped chunk |
| 28 | """ |
| 29 | chunk = bytearray(chunk_orig) |
| 30 | |
| 31 | # align to 4 bytes and pad with 0x0 |
| 32 | chunk_len = len(chunk) |
| 33 | pad_len = chunk_len % 4 |
| 34 | if pad_len > 0: |
| 35 | chunk += b'\x00' * (4 - pad_len) |
| 36 | |
| 37 | chunk[0::4], chunk[1::4], chunk[2::4], chunk[3::4] =\ |
| 38 | chunk[3::4], chunk[2::4], chunk[1::4], chunk[0::4] |
| 39 | |
| 40 | return chunk |
| 41 | |
| 42 | def main(): |
| 43 | args = parse_args() |
| 44 | |
| 45 | with open(args.input_bin, "rb") as input_bin: |
| 46 | with open(args.output_bin, "wb") as output_bin: |
| 47 | while True: |
| 48 | chunk = bytearray(input_bin.read(args.chunk_size)) |
| 49 | if not chunk: |
| 50 | break |
| 51 | |
| 52 | output_bin.write(swap_chunk(chunk)) |
| 53 | |
| 54 | if __name__ == '__main__': |
| 55 | main() |