Spaces:
Sleeping
Sleeping
| import os | |
| import hamming | |
| startbin = "001110010011100100110111001100110111001101110100011000010111001001110100" | |
| endbin = "00111001001110010011011100110011011001010110111001100100" | |
| def fuzzy_find(bit_string, target_word, min_match_ratio=0.85): | |
| best_match_idx = -1 | |
| best_match_count = 0 | |
| target_len = len(target_word) | |
| # Slide the window across the received audio binary | |
| for i in range(len(bit_string) - target_len + 1): | |
| window = bit_string[i: i + target_len] | |
| # Count exactly how many bits match the target word | |
| match_count = sum(1 for a, b in zip(window, target_word) if a == b) | |
| # Keep track of the highest score | |
| if match_count > best_match_count: | |
| best_match_count = match_count | |
| best_match_idx = i | |
| # Did the best match meet our 85% threshold? | |
| match_percentage = best_match_count / target_len | |
| if match_percentage >= min_match_ratio: | |
| print(f"[+] Sync Word locked at index {best_match_idx} with {match_percentage * 100:.1f}% confidence.") | |
| return best_match_idx | |
| else: | |
| return -1 | |
| def toBinary(path, save=True): | |
| with open(path, 'r') as f: | |
| name = f.read() | |
| b = ''.join(format(ord(char), '08b') for char in name) | |
| filename = os.path.basename(path) | |
| os.makedirs('tests_output', exist_ok=True) | |
| b = hamming.encode_hamming(b) | |
| b = startbin + b + endbin | |
| if save: | |
| with open(f'tests_output/binary_{filename}', 'w') as f: | |
| f.write(b) | |
| return b | |
| def toString(path, save=True): | |
| with open(path, 'r') as f: | |
| b = f.read().replace('\n', '').replace(' ', '') | |
| # 1. FUZZY SEARCH for the startbin (Require 80% match) | |
| start_idx = fuzzy_find(b, startbin, 0.80) | |
| if start_idx == -1: | |
| raise ValueError("Start sequence not found! Preamble was totally destroyed.") | |
| payload_start = start_idx + len(startbin) | |
| # 2. FUZZY SEARCH for the endbin (Starting from where the payload begins) | |
| # This prevents the scanner from accidentally finding the startbin again! | |
| search_area_for_end = b[payload_start:] | |
| relative_end_idx = fuzzy_find(search_area_for_end, endbin, 0.80) | |
| if relative_end_idx == -1: | |
| print("[!] Warning: End sequence not found. Message might be cut off.") | |
| end_idx = len(b) # Decode to the end of the file anyway | |
| else: | |
| end_idx = payload_start + relative_end_idx | |
| # 3. Slice out EXACTLY the Hamming-encoded payload | |
| encoded_payload = b[payload_start: end_idx] | |
| # 4. HAMMING DECODE (Heal the payload) | |
| clean_payload = hamming.decode_hamming(encoded_payload) | |
| # 5. Convert back to text | |
| clean_payload = clean_payload[:len(clean_payload) - len(clean_payload) % 8] | |
| bytes_list = [int(clean_payload[i:i + 8], 2) for i in range(0, len(clean_payload), 8)] | |
| data = bytes(bytes_list) | |
| print(f"\n[+] DECODED PAYLOAD: {data.decode('utf-8', errors='ignore')}\n") | |
| filename = os.path.basename(path) | |
| os.makedirs('tests_output', exist_ok=True) | |
| if save: | |
| with open(f'tests_output/string_{filename}', 'wb') as f: | |
| f.write(data) | |
| return data | |
| if __name__ == '__main__': | |
| print("this is the conversion.py") |