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.
źródło
Odpowiedzi:
Wątpię, czy
otherwise transcribing it will be too difficult
to 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 nawetRed 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 bytes
musiałby zostać pomnożony przez dwa, aby uzyskać liczbę szesnastkową, która jest11130 hexadecimals
(w przeciwieństwie do44520 bits
), którą można umieścić w106 x 106
siatce.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
Q
i9
są takie same, więc chcesz, aby prawy górny pikselQ
był biały dla wyraźnego rozróżnienia. Baza 32 wymaga jedynie53 x 53
siatki dla twojego przykładu, a także niewielkiego odstępu między literami.źródło
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.
źródło
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
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:
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ówne0x000
,{set 1}{set 2}
równe0x001
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:
Ab
=aba
;aB
=abab
;AB
=ababab
...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.
źródło
alt
+a
Dla kursywy „a”).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;)
źródło
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.
źródło