#!/usr/bin/env python3
import sys
import os
def reverse_bits_in_file(input_path, output_path):
# Проверяем физическое наличие входного файла
if not os.path.exists(input_path):
print(f"Ошибка: Входной файл '{input_path}' не найден.")
return False
# Читаем исходный чистый бинарный массив
with open(input_path, 'rb') as f:
raw_data = f.read()
file_size = len(raw_data)
print(f"Открыт файл: {input_path} ({file_size} байт)")
print("Инвертирую порядок бит в каждом байте для шины I2C (MSB-first)...")
# Быстрая инверсия бит: 0b11000110 (0xC6) -> 0b01100011 (0x63)
# Таблица перевода (lookup table) для ускорения обработки больших массивов
bit_rev_table = bytes(int('{:08b}'.format(i)[::-1], 2) for i in range(256))
# Запускаем побитовое зеркалирование всего потока данных
reversed_data = bytearray(raw_data)
for i in range(file_size):
reversed_data[i] = bit_rev_table[reversed_data[i]]
# Сохраняем итоговый файл прошивки
with open(output_path, 'wb') as f:
f.write(reversed_data)
print(f"Успешно обработано! Файл сохранен в: {output_path} ({len(reversed_data)} байт)")
return True
if __name__ == "__main__":
# Проверяем корректность переданных параметров командной строки
if len(sys.argv) < 3:
print("Использование:")
print(f" python3 {os.path.basename(__file__)} <input_file.bin> <output_file.bin>")
print("\nПример:")
print(f" python3 {os.path.basename(__file__)} LED_factory.bin LED_final_i2c.bin")
sys.exit(1)
infile = sys.argv[1]
outfile = sys.argv[2]
# Защита от случайного перезаписывания исходника мусором
if infile == outfile:
print("Ошибка: Имя входного и выходного файлов не должно совпадать!")
sys.exit(1)
success = reverse_bits_in_file(infile, outfile)
sys.exit(0 if success else 1)