diff options
author | Daniel Schwierzeck <daniel.schwierzeck@gmail.com> | 2020-06-06 23:21:47 +0300 |
---|---|---|
committer | Daniel Schwierzeck <daniel.schwierzeck@gmail.com> | 2020-06-29 23:36:35 +0300 |
commit | 753a8922f8a34af43a14de1cdb4eec5ef82961ee (patch) | |
tree | a8b757e9f1b85ebe31fd7ba78b63c7a34541532c | |
parent | d8553d6ee3146bc06b8f86787138293d3f6453c3 (diff) | |
download | u-boot-753a8922f8a34af43a14de1cdb4eec5ef82961ee.tar.xz |
tools: add script for byte endianness swapping
This can be used to swap the byte endianness of a binary file
from Little-Endian to Big-Endian or vice-versa.
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
-rwxr-xr-x | tools/endian-swap.py | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tools/endian-swap.py b/tools/endian-swap.py new file mode 100755 index 0000000000..5990efa313 --- /dev/null +++ b/tools/endian-swap.py @@ -0,0 +1,55 @@ +#!/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() |