SAE Teensy ECU
IIT SAE Microcontroller programming
Loading...
Searching...
No Matches
bin2cc.py
Go to the documentation of this file.
1"""
2@file bin2cc.py
3@author LeHuman
4@brief Convert file string to zlib compressed C array
5@version 0.1
6@date 2021-10-31
7
8@copyright Copyright (c) 2022
9
10https://nachtimwald.com/2019/10/09/python-binary-to-c-header/
11"""
12
13import sys
14import zlib
15import argparse
16
17LINE_LEN = 8
18
19
20def bin2cc(data: bytes, var_name: str) -> str:
21 """Generate a C char array from bytes
22 Args:
23 data (bytes): The bytes
24 var_name (str): The C variable name
25
26 Returns:
27 str: The string of C code
28 """
29
30 # zlib compress data
31 ulen = len(data)
32 data = bytes(data, "UTF-8")
33 data = zlib.compress(data, 9)
34
35 data = data.hex(" ", 1).split(" ")
36
37 out: list[str] = []
38 out.append(f"unsigned char {var_name}[] = {{")
39
40 chunks = [data[i : i + LINE_LEN] for i in range(0, len(data), LINE_LEN)]
41
42 padding_len = 0
43
44 for i, nums in enumerate(chunks):
45 line = ", ".join([f"0x{c}" for c in nums])
46 comma = "," if (i < len(chunks) - 1) else ""
47 padding_len = LINE_LEN - len(nums)
48 out.append(f" {line}{comma}")
49
50 if padding_len > 0:
51 out[len(out) - 1] += ", 0x00" * padding_len
52 # out[len(out) - 1] += ","
53 out.append("};")
54 out.append(f"unsigned int {var_name}_pad_len = {len(data)+padding_len};")
55 out.append(f"unsigned int {var_name}_uncmp_len = {ulen};")
56 out.append(f"unsigned int {var_name}_len = {len(data)};")
57
58 return "\n".join(out)
59
60
61def main():
62 """Main Function"""
63 parser = argparse.ArgumentParser(description="Generate binary header output")
64 parser.add_argument("-i", "--input", required=True, help="Input file")
65 parser.add_argument("-o", "--out", required=True, help="Output file")
66 parser.add_argument("-v", "--var", required=True, help="Variable name to use in file")
67
68 args = parser.parse_args()
69 if not args:
70 return 1
71
72 with open(args.input, "r", encoding="UTF-8") as file:
73 data = file.read()
74
75 out = bin2cc(data, args.var)
76 with open(args.out, "w", encoding="UTF-8") as file:
77 file.write(out)
78
79 return 0
80
81
82if __name__ == "__main__":
83 sys.exit(main())