
import matplotlib
matplotlib.use('Agg')  # Set the backend to non-interactive
import matplotlib.pyplot as plt
plt.ioff()
import os
os.environ['TERM'] = 'dumb'
# END: user added these matplotlib lines to ensure any plots do not pop-up in their UI
# filename: extrage_date_binare.py
# execution: true

def este_caracter_valid(caracter):
    """Verifică dacă caracterul este o literă, cifră sau semn de punctuație acceptat."""
    cod_ascii = ord(caracter)
    # Verifică dacă este literă, cifră sau semn de punctuație specificat
    if (48 <= cod_ascii <= 57) or  # cifre
       (65 <= cod_ascii <= 90) or  # litere mari
       (97 <= cod_ascii <= 122) or  # litere mici
       caracter in [' ', '.', ',', ':', ';', '!']:  # semne de punctuație și spațiu
        return True
    return False

def extrage_caractere_valide(secventa_binara, offset, pas):
    """
    Extrage caractere ASCII valide din secvența binară, începând de la offset specificat,
    și grupând biții din pas în pas.
    """
    rezultate = []
    
    # Procesează secvența binară în grupuri de 8 biți
    for i in range(offset, len(secventa_binara) - 7, pas):
        # Extrage 8 biți
        grup_biti = secventa_binara[i:i+8]
        
        # Convertește la valoare ASCII
        valoare_ascii = int(grup_biti, 2)
        caracter = chr(valoare_ascii)
        
        # Verifică dacă este un caracter valid
        if este_caracter_valid(caracter):
            rezultate.append((i, caracter))
    
    return rezultate

def main():
    try:
        # Încearcă să citească fișierul cu date binare
        with open('datebinare.txt', 'r') as f:
            continut = f.read().strip()
        
        # Elimină orice caracter care nu este 0 sau 1
        secventa_binara = ''.join(bit for bit in continut if bit in ['0', '1'])
        
        if not secventa_binara:
            print("Fișierul nu conține date binare valide (0 și 1).")
            return
        
        print(f"Lungimea secvenței binare: {len(secventa_binara)} biți")
        
        # Deschide fișierul pentru rezultate
        with open('rezultate_extrase.txt', 'w') as out_file:
            # Metodă 1: Extrage caractere luând 8 biți consecutivi, cu diferite offset-uri
            out_file.write("=== METODA 1: Grupuri de 8 biți consecutivi ===\n")
            for offset in range(8):
                rezultate = extrage_caractere_valide(secventa_binara, offset, 1)
                if rezultate:
                    out_file.write(f"\nRezultate cu offset {offset}:\n")
                    out_file.write(f"Poziție\tCaracter\n")
                    for pozitie, caracter in rezultate:
                        out_file.write(f"{pozitie}\t{caracter}\n")
                    
                    # Încearcă să formeze un text coerent
                    text = ''.join(caracter for _, caracter in rezultate)
                    out_file.write(f"\nText posibil: {text}\n")
            
            # Metodă 2: Extrage caractere luând biți din 2 în 2
            out_file.write("\n\n=== METODA 2: Grupuri de 8 biți, luați din 2 în 2 ===\n")
            for offset in range(8):
                rezultate = extrage_caractere_valide(secventa_binara, offset, 2)
                if rezultate:
                    out_file.write(f"\nRezultate cu offset {offset}, pas 2:\n")
                    out_file.write(f"Poziție\tCaracter\n")
                    for pozitie, caracter in rezultate:
                        out_file.write(f"{pozitie}\t{caracter}\n")
                    
                    # Încearcă să formeze un text coerent
                    text = ''.join(caracter for _, caracter in rezultate)
                    out_file.write(f"\nText posibil: {text}\n")
            
            # Metodă 3: Extrage caractere luând biți din 7 în 7
            out_file.write("\n\n=== METODA 3: Grupuri de 8 biți, luați din 7 în 7 ===\n")
            for offset in range(8):
                rezultate = extrage_caractere_valide(secventa_binara, offset, 7)
                if rezultate:
                    out_file.write(f"\nRezultate cu offset {offset}, pas 7:\n")
                    out_file.write(f"Poziție\tCaracter\n")
                    for pozitie, caracter in rezultate:
                        out_file.write(f"{pozitie}\t{caracter}\n")
                    
                    # Încearcă să formeze un text coerent
                    text = ''.join(caracter for _, caracter in rezultate)
                    out_file.write(f"\nText posibil: {text}\n")
        
        print("Analiza a fost finalizată. Rezultatele au fost salvate în fișierul 'rezultate_extrase.txt'")
        
    except FileNotFoundError:
        print("Fișierul 'datebinare.txt' nu a fost găsit.")
    except Exception as e:
        print(f"A apărut o eroare: {e}")

if __name__ == "__main__":
    main()
