Jak przesłać plik za pomocą pióra i papieru, z korekcją błędów

22

Szukam sposobu na przesłanie pliku za pomocą długopisu i papieru.

Jest to nieco podobne do paperbak , z wyjątkiem tego, że gęstość, której szukam, jest znacznie niższa i nie chcę używać drukarki ani skanera.

Oczywiście pierwszą odpowiedzią jest kodowanie Base64 . Ale pisanie i czytanie tak dużej liczby znaków z pewnością spowoduje błędy. Dla moich celów każdy błąd jest niedopuszczalny.

Drugą odpowiedzią może być korekcja błędów Reeda-Solomona (na przykład przy użyciu rsbep ). Jest to jednak również problem, ponieważ z mojego zrozumienia, kody Reeda-Solomona nie korygują błędów wstawiania / usuwania, które są prawdopodobnie bardziej prawdopodobne niż błędy podmiany w tym przypadku.

Czy jest jakiś program, który koduje / dekoduje dowolne pliki z kodami korekcji błędów uwzględniającymi wstawianie / usuwanie? Najlepiej powinien działać w systemach Windows, Linux i Mac OS X

Oczywiście każde inne rozwiązanie ogólnego problemu jest mile widziane.

Jeremy Salwen
źródło
Czy spodziewasz się błędów w pisaniu, czy po prostu w czytaniu?
Christian Mann
Oczekuję błędów w obu przypadkach, ale spodziewam się, że będą równoważne ...
Jeremy Salwen,
Przepraszam. Źle odczytałem i pomyślałem, że drukujesz. Chcesz napisać to ręcznie?
Christian Mann
3
Ile kolorów długopisów mogę użyć? :)
Der Hochstapler
1
Tylko jednokolorowy długopis, w przeciwnym razie przepisywanie go będzie zbyt trudne. W rzeczywistości przesyłam skompresowany, podpisany, zaszyfrowany tekst, więc przy założeniu nawet 50% wskaźnika redundancji, całkowita ilość pisania będzie <1,5 razy większa niż w rzeczywistości napisanie oryginalnego tekstu (po uwzględnieniu kompresji ). Istnieje jednak problem polegający na tym, że kopiowanie losowych znaków jest trudniejsze niż kopiowanie tekstu w języku angielskim. Aby odpowiedzieć na twoje pytanie, z pewnością tylko w zakresie kilku KB.
Jeremy Salwen

Odpowiedzi:

4

Wątpię, czy otherwise transcribing it will be too difficultto będzie problem.

Powiedzmy, że masz czerwony, zielony, niebieski i czarny. Możesz napisać skrypt, który zamieni twoje dane w zbiór listów RGBY, np .: RGBYGBRYBGBYRYYBYBRYYG(lub nawet Red Green Blue Black Green Blue Red Black...w arkuszu Excela) iz powrotem. Jest to tylko kwestia konwersji bazy danych binarnych z bazy 2 (lub danych szesnastkowych z bazy 16) do bazy w ilości kolorów, które przyjmujesz (4 w tym przykładzie).

Najbardziej logicznym podejściem byłoby zdobycie 16 kolorów. W ten sposób musisz użyć 4 razy mniej kropek, co sprawia, że ​​warto przełączać się między piórami. Pozwala to na zapisanie 4 razy więcej danych na papierze, jeśli jest to konieczne, a być może może być 4 razy mniej dokładne przy wstawianiu kropek, skalowanie zależy od Ciebie. Naprawdę odradzałbym rysowanie każdego kawałka.

Na przykład 5565 bytesmusiałby zostać pomnożony przez dwa, aby uzyskać liczbę szesnastkową, która jest 11130 hexadecimals(w przeciwieństwie do 44520 bits), którą można umieścić w 106 x 106siatce.

W zależności od rodzaju danych prawdopodobnie możesz uzyskać pewne optymalizacje ...

Wskazówka: próba wybrania najbardziej wyraźnych (najbardziej kontrastowych) kolorów ...

Alternatywy, w których można użyć jednego długopisu:

  • Reprezentują różne szesnastkowych według różnych symboli -, /, |, \, +, ...

  • Reprezentuj różne wartości szesnastkowe małą czcionką pikselową, patrz mój awatar.

    To sprawia, że ​​nawet użyteczne jest użycie czegoś takiego jak Baza 32 (lub Baza 36). Zauważ, że Qi 9są takie same, więc chcesz, aby prawy górny piksel Qbył biały dla wyraźnego rozróżnienia. Baza 32 wymaga jedynie 53 x 53siatki dla twojego przykładu, a także niewielkiego odstępu między literami.

Tamara Wijsman
źródło
Jest z tym kilka problemów. 1. Jestem ślepy na kolory. 2. Wymaga kupienia długopisów. 3. W ogóle nie pomaga w korekcji błędów. 4. Obejmuje pisanie kodów zamiast tekstu, w których ludzie są gorsi.
Jeremy Salwen,
@JeremySalwen: Uhm, pisanie znaków w siatce nie jest naprawdę trudne. I możesz poprawić błędy, pisząc dodatkowe numery kontroli podłużnej lub CRC. Ale tak naprawdę bardzo łatwo jest napisać litery z siatki do siatki, co najgorsze, jeśli przejrzysz ją ponownie, aby sprawdzić poprawność.
Tamara Wijsman
1
@JeremySalwen: A jeśli jesteś ślepy na kolory, po prostu nie bierzesz żadnego z kolorów, dla których jesteś ślepy na kolory.
Tamara Wijsman
1
Ślepota kolorów jest bardziej redukcją wymiarową przestrzeni kolorów niż selektywną niemożnością dostrzeżenia niektórych kolorów. Mam na myśli, że prawdopodobnie mógłbym ściągnąć czarny, niebieski, żółty, czerwony, zielony, szary, ale niewiele więcej
Jeremy Salwen,
@Tom Prawdopodobnie powinieneś umieścić swojego starego awatara, aby uniknąć zamieszania :)
Nate Koppenhaver
2

Jeśli chcesz, aby ludzie mogli czytać i zapisywać dane, problem z Base64 i wieloma kodowaniami tekstowymi polega na tym, że używają znaków takich jak I, l, 1, |, /, 0, O, o itd., Że ludzie mylą ze sobą.

Sprawdź kodowanie Douglasa Crockforda Base32 . Jego alfabet został specjalnie wybrany, aby uniknąć podobnych znaków, i obejmuje wykrywanie błędów.

Dour High Arch
źródło
Dzięki, prawdopodobnie skorzystam z tego, ale to nadal nie rozwiązuje problemu korekcji błędów.
Jeremy Salwen
@Jeremy, implementacja Crockford obejmuje wykrywanie błędów . Jeśli chcesz poprawić błędy, sprawdź poprawkę dotyczącą błędu przesyłania dalej ( en.wikipedia.org/wiki/Forward_error_correction ).
Dour High Arch
1

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 0x001itp.

    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.

Lèse majesté
źródło
Oczywiście planuję również używać wielkich liter. Spośród wszystkich schematów korekcji błędów, które zasugerowałeś, nie widzę żadnego sposobu na ich wdrożenie bez zaprojektowania niestandardowego formatu pliku itp. Czy naprawdę nie ma precedensu dla zabezpieczenia plików przed poprawianiem błędów? Być może powinienem również wspomnieć, że tworzenie niestandardowych programów jest również wysoce niepożądane? Nie mogę znaleźć żadnego programu, który po prostu ochroniłby twoje pliki za pomocą kodów korygujących błędy.
Jeremy Salwen,
Nie miałem na myśli tylko używania wielkich liter, ale także różnych skryptów / czcionek. Jeśli używasz tylko wielkich i małych znaków alfanumerycznych, masz tylko 62 glify lub 3844 punktów kodowych. Możesz uzyskać ponad trzykrotną liczbę punktów kodowych, używając 2 skryptów, wykorzystując nośnik pamięci używany do przesyłania, co było celem mojej odpowiedzi. Jeśli nie chcesz skorzystać z faktu, że jest to nośnik zapisany, istnieje wiele formatów plików, które implementują kodowanie błędów. Większość formatów archiwów / kompresji ma wbudowaną korekcję błędów.
Lèse majesté 24.04. O
Nie jestem jednak pewien, co masz na myśli, tworząc nowe formaty plików. Wszystkie wymienione przeze mnie techniki służą do wizualnego kodowania dowolnych danych binarnych w odręcznym tekście / znakach. Nie zapisałbyś ich na komputerze w ten sposób (nie mogłeś przechować zeskanowanego obrazu). Zasadniczo miałbyś program do kodowania danych, wyświetlający obraz na ekranie, aby użytkownik mógł go skopiować. Następnie, aby przenieść go z powrotem na komputer, użyłbyś programu dekodującego, który albo OCR / OMR skanuje obraz, albo akceptuje wprowadzanie za pomocą klawiatury (np. alt+ aDla kursywy „a”).
Lèse majesté
Widzisz, z tym mam problem: „miałbyś program do kodowania danych” ... nie, nie mam. Nie mam takiego programu i nie znam żadnego takiego programu. Nie znam też żadnego formatu pliku, który z wdziękiem poradziłby sobie z bajtem usuniętym (nie skasowanym) z początku pliku poza innymi błędami. Zdecydowanie zgadzam się, że są to metody zwiększania gęstości danych, ale teraz nie jest to moim głównym zmartwieniem, to łatwość odczytu / zapisu i ochrona przed błędami.
Jeremy Salwen,
@Jeremy: Jak powiedziałem, większość formatów archiwów ma wbudowaną korekcję błędów, która wydaje się działać wystarczająco dobrze dla większości ludzi. Ale jeśli chcesz czegoś specjalnie zaprojektowanego do ręcznej transkrypcji, musisz napisać lub poprosić kogoś o napisanie czegoś dla ciebie. W przeciwnym razie najlepszym rozwiązaniem jest sprawdzenie istniejących aplikacji przeznaczonych do transmisji w kanałach o wysokim poziomie hałasu. Chociaż najłatwiejszą opcją bez obawy o gęstość danych jest po prostu użycie pliku RAR z wysokim poziomem korekcji błędów, a następnie powtórzenie sekcji nagłówka 3 razy w celu potrójnej redundancji modułowej.
Lèse majesté
1

W tym celu używaliśmy S-Records . W celu wykrycia błędu istniała prosta suma kontrolna dla każdego wiersza. Zwykle wszystkie oprócz ostatniej linii miały ustaloną długość, więc znacznik końca linii służył jako kontrola wstawiania i usuwania. Nie sprawdzono jednak brakujących linii. W tym celu po prostu policzyliśmy liczbę linii. Najczęściej pliki były krótkie, mniej niż 100 linii, ale pamiętam co najmniej jeden, który miał 300 linii lub więcej. Wpisywanie plików do systemu było bardzo żmudne. Oczywiście, wśród pierwszych przeniesionych w ten sposób programów znalazł się downloader;)

Emerytowany szpieg
źródło
0

Optyczne rozpoznawanie znaków jest używane od dziesięcioleci do tworzenia odręcznych formularzy do odczytu maszynowego. Strona Wikipedii zawiera linki do kilku wersji Open Source.

Szkoły od dawna używają OMR do testowania; formularze są proste w użyciu i czytaniu, a dokładność jest zwykle lepsza niż wprowadzanie z klawiatury. Aby zwiększyć dokładność, komercyjni producenci, tacy jak Scantron i ReMark, mogą tworzyć niestandardowe formularze.

Dour High Arch
źródło
To ciekawe, niestety wymaga do pracy skanera lub innego systemu obrazowania podłączonego do komputera.
Jeremy Salwen