| #!/usr/bin/env python3 |
| # SPDX-License-Identifier: GPL-2.0+ |
| |
| """ |
| Simple tool to swap the byte endianness of a binary file. |
| """ |
| |
| import argparse |
| import io |
| |
| def parse_args(): |
| """Parse command line arguments.""" |
| description = "Swap endianness of given input binary and write to output binary." |
| |
| parser = argparse.ArgumentParser(description=description) |
| parser.add_argument("input_bin", type=str, help="input binary") |
| parser.add_argument("output_bin", type=str, help="output binary") |
| parser.add_argument("-c", action="store", dest="chunk_size", type=int, |
| default=io.DEFAULT_BUFFER_SIZE, help="chunk size for reading") |
| |
| return parser.parse_args() |
| |
| def swap_chunk(chunk_orig): |
| """Swap byte endianness of the given chunk. |
| |
| Returns: |
| swapped chunk |
| """ |
| chunk = bytearray(chunk_orig) |
| |
| # align to 4 bytes and pad with 0x0 |
| chunk_len = len(chunk) |
| pad_len = chunk_len % 4 |
| if pad_len > 0: |
| chunk += b'\x00' * (4 - pad_len) |
| |
| chunk[0::4], chunk[1::4], chunk[2::4], chunk[3::4] =\ |
| chunk[3::4], chunk[2::4], chunk[1::4], chunk[0::4] |
| |
| return chunk |
| |
| def main(): |
| args = parse_args() |
| |
| with open(args.input_bin, "rb") as input_bin: |
| with open(args.output_bin, "wb") as output_bin: |
| while True: |
| chunk = bytearray(input_bin.read(args.chunk_size)) |
| if not chunk: |
| break |
| |
| output_bin.write(swap_chunk(chunk)) |
| |
| if __name__ == '__main__': |
| main() |