u-boot-brain/tools/endian-swap.py

56 lines
1.5 KiB
Python
Executable File

#!/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()