Загрузка данных


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