Add script for converting arbitrary binary data to C arrays

This is similar to the existing png2c, but works for any binary data,
not just PNG files.

Another small difference is that this script puts 16 bytes per line
instead of 8 -- this still results in reasonably short lines, but twice
shorter files, so seems to be worth it.
This commit is contained in:
Vadim Zeitlin
2022-01-23 00:39:38 +00:00
parent dcc15ddb71
commit a2ad755b1c

47
misc/scripts/bin2c.py Executable file
View File

@@ -0,0 +1,47 @@
#!/usr/bin/env python
#
# This is a slightly generalized version of bin2c.py and is based on it.
import sys
import os
import os.path
import re
import array
if len(sys.argv) < 2:
print("""Usage: bin2c binary_file...
Output input files data as C arrays to standard output.""")
sys.exit(1)
r = re.compile("^([a-zA-Z._][a-zA-Z._0-9]*)[.]([a-zA-Z_0-9]+)$")
for path in sys.argv[1:]:
filename = os.path.basename(path).replace('-','_')
m = r.match(filename)
# Allow only filenames that make sense as C variable names
if not(m):
print("Skipped file (unsuitable filename): " + filename)
continue
# Read file as character array
bytes = array.array('B', open(path, "rb").read())
count = len(bytes)
# Create the C header
text = "/* %s - %d bytes */\n" \
"static const unsigned char %s_%s_data[] = {\n" % (
filename, count, m.group(1), m.group(2))
i = 0
for byte in bytes:
if i % 16 == 0:
text += "\n "
i += 1
text += " 0x%02x" % byte
if i != count:
text += ","
text += "\n};"
print(text)