uboot/tools/endian-swap.py
<<
>>
Prefs
   1#!/usr/bin/env python3
   2# SPDX-License-Identifier: GPL-2.0+
   3
   4"""
   5Simple tool to swap the byte endianness of a binary file.
   6"""
   7
   8import argparse
   9import io
  10
  11def 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
  23def 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
  42def 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
  54if __name__ == '__main__':
  55    main()
  56