Po przeczytaniu twoich komentarzy brzmi to bardziej rozsądnie. Po prostu nie byłem pewien, czy zamierzasz kodować megabajty takich danych.
Poleciłbym, zgodnie z sugestią Olivera, zwiększenie gęstości danych poprzez pożyczenie strony z szyfru Bacona , której gangi więzienne często używają do kodowania ukrytych wiadomości w listach napisanych w 2 różnych stylach skryptowych - zwykle albo wyższy, albo wyższy małe litery lub druk kontra znaki kursywne, np
Hey mOM, WHAT's FOR diNNeR TODAY? = ABBBA AAAAA BAAAB BAABA AAAAA
= P A S T A
Ponieważ jednak Twoim celem nie jest stegnografia, możesz po prostu użyć tego do rozszerzenia zestawu glifów. W ten sposób możesz mieć do 114 glifów wykorzystujących drukowane i kursywne znaki alfanumeryczne lub 12996 punktów kodowych przy użyciu kodowania dwuznakowego.
Ponieważ jednak wszystkie liczby glifów większe niż 15 i mniejsze niż 256 są zasadniczo takie same dla prostego szyfru danych binarnych (co oznacza, że nadal potrzebujesz 2 znaków do reprezentowania każdego bajtu, co daje gęstość danych 4 bitów na znak w wszystkie przypadki), możesz użyć dodatkowych 98 glifów / 12740 punktów kodowych do wykrywania / korekcji błędów.
Sposoby na to:
- Wybierz zestaw 256 najłatwiejszych do odczytu / zapisu kombinacji znaków. Jeśli wystąpi jakakolwiek inna kombinacja znaków, wiesz, że to błąd kopiowania.
- Użyj dwóch wersji znaku końcowego jako bitu parzystości.
Utwórz 50 różnych 16-znakowych zestawów glifów. Następnie można ich użyć do szyfrowania danych korekcji błędów.
Np. {set 1}{set 1}
Oznacza kolejne 3 skubania równe 0x000
, {set 1}{set 2}
równe 0x001
itp.
Można go użyć do przedstawienia 2500+ z 4096 możliwych 1,5 bajtowych wartości. Podobnie, możesz użyć tylko 16 zestawów do reprezentowania wszystkich wartości następnego bajtu, co daje 100% redundancję bez zwiększania długości zakodowanych danych.
Alternatywnie możesz użyć dodatkowych glifów do dodatkowej kompresji:
- Zaimplementuj kodowanie o zmiennej szerokości, wybierając 98 jednoznakowych punktów kodowych. Zmniejszyłoby to średni rozmiar zakodowanej zawartości o około 20%.
- Zaimplementuj coś podobnego do kodowania przez uruchomienie, używając różnych zestawów glifów lub kombinacji zestawów glifów, aby reprezentować powtarzające się skrypty / bajty. Np.
Ab
= aba
; aB
= abab
; AB
= ababab
...
- Użyj dodatkowych glifów lub punktów kodowych do reprezentowania „słów” i „fraz” powtarzanych w danych. Chociaż wstępnie skompresowane dane prawdopodobnie będą miały wysoki poziom entropii, więc nie wiem, jak by to było skuteczne.
Aby jeszcze bardziej ograniczyć błędy kopiowania, wyświetlałbym zakodowaną zawartość w liniach siatki i kopiowałbym na papierze milimetrowym. Jeśli możesz użyć niestandardowego stacjonarnego, który ma naprzemienne kolory kolumn / wierszy lub szachownicę w kratkę z literami kolumn i ponumerowanych wierszy do szybkiego wyszukiwania, co dodatkowo zwiększy dokładność kopiowania.
Możesz także łączyć naprzemienny układ siatki ze naprzemiennymi stylami znaków jako łatwą formę wykrywania błędów. Tzn. Jeśli nieparzyste kolumny są zawsze pisane dużymi literami, jeśli transkrybent pisze małe litery w nieparzystych kolumnach, wtedy wie, że popełnił błąd i może zacząć śledzić wstecz, aby zobaczyć, gdzie to się stało.
Chociaż jeśli twoim głównym priorytetem jest dokładność, użyłbym kodowania binarnego +
kodu Hamminga . Używając (12, 8) skróconego kodu Hamminga na standardowym papierze milimetrowym, możesz zmieścić tylko 187 bajtów, kodując tylko 124 bajty danych. Ale można go bardzo szybko przepisać (ukośnik na 1, nic na 0) i zapewnić pojedynczą korektę błędu. Przetwarzanie dodatkowego bitu parzystości (13, 8) zapewni SECDED (korekcja pojedynczego błędu, wykrywanie podwójnego błędu). Używając standardowego kodu Hamminga, takiego jak (15, 11) lub (31, 26), uzyskujesz jeszcze lepszą wydajność, odpowiednio 137 i 156 bajtów danych na arkusz. Można osiągnąć nawet wyższe współczynniki kodowania, w zależności od tego, jak dokładny Twoim zdaniem może być Twój abonent.
Kodowanie binarne byłoby również łatwiejsze do odczytania (na głos) i OCR / OMR.