#!/usr/bin/env python3
import sys
import os
def process_bitstream(input_path, output_path):
if not os.path.exists(input_path):
print(f"Error: File {input_path} not found.")
return False
with open(input_path, 'rb') as f:
raw_data = f.read()
file_size = len(raw_data)
curr_pos = 4 # Пропускаем "LSCC"
# Ищем позицию преамбулы Nexus (байт 0xB3)
pos_b3 = -1
for i in range(curr_pos, file_size - 3):
if raw_data[i] == 0xb3 and raw_data[i - 1] in (0xbd, 0xbe, 0xbf):
pos_b3 = i
break
if pos_b3 == -1:
print("Error: Preamble not found!")
return False
end_header = pos_b3 - 4 # Точка отсечения заголовка (346 байт)
# Извлекаем чистое тело битстрима (808325 байт)
clean_bitstream = raw_data[end_header:]
# !!! КЛЮЧЕВОЙ ШАГ: Зеркально разворачиваем биты в каждом байте для I2C (MSB-first)
# Пример: 0b11000110 (0xC6) превратится в 0b01100011 (0x63)
reversed_bitstream = bytes(int('{:08b}'.format(b)[::-1], 2) for b in clean_bitstream)
with open(output_path, 'wb') as f:
f.write(reversed_bitstream)
print(f"Successfully processed!")
print(f"Original size: {file_size} -> Stripped header ({end_header} bytes) -> Reversed bits.")
print(f"Output saved to {output_path} ({len(reversed_bitstream)} bytes).")
return True
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: python3 parse_and_reverse.py <input.bit> <output.bin>")
sys.exit(1)
success = process_bitstream(sys.argv[1], sys.argv[2])
sys.exit(0 if success else 1)