Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Odkodowanie danych binarnych

silvvester 19 Paź 2009 11:57 2344 8
  • #1 19 Paź 2009 11:57
    silvvester
    Poziom 24  

    Mój problem nie kwalifikuje się raczej do żadnego działu , jeśli ktoś będzie w stanie pomóc
    to najprawdopodobniej tu .

    Nawet nie wiem jak zadać pytanie więc rozbije to na czynniki pierwsze .
    Posiadam program typu sterownik urządzenia drukującego , dane są wysyłane
    na port com , przez ft245 , przechwytuje te dane i wysyłam do podglądu z powrotem na komputer .

    Czyli mam taki tymczasowy układ dla przechwycenia danych :
    soft sterownik -> ft245 -> atmega jako kopiarka danych -> ft245 -> do komputera
    do podglądu przez dowolny terminal

    Sterownik urządzenia ma za zadanie przetworzyć bitmapę i wysłać ją z kompresją do urządzenie , tam mikrokontroler pobiera dane z ft245 i steruje wiązką laserową
    analogicznie jak w drukarce laserowej promień lasera naświetla bęben światłoczuły .

    Walczę z tym już tyle i pomysły mi się kończą , jak to odkodować .
    Odkodowanie danych binarnych

    Na rysunku są dane z lewej strony i 2 pikselowe linie po prawej
    jak się domyśliłem nie wiem czy słusznie , najmniej znaczący bit zerowy odpowiada za zapalenie lub zgaszenie lasera .
    I tak lecąc od góry mam nagłówek który rozgryzłem , 16 nie istotna ,
    właściwe dane odpowiadające za ilość pikseli naświetlonych :
    00111111 dec 63 odczytuje to jako naświetl 2 piksele

    00001000 dec 8
    00100000 dec 32 odczytuje to jako wygaś laser na 2 piksele

    00000011 dec 3 zapal na 2 piksele

    Narazie kombinowałem z sumowaniem , pominięciem jednego , dwu bitów i za cholere nie mogę dojść to tego żeby suma pikseli białych i czarnych była choćby proporcjonalna do wartości danych przechwyconych .
    Nie proszę o gotowca zaneguj bit xx przesuń w prawo i zrób EXOR tylko o jakieś linki gdzie choćby coś załapię . Wiem że to nie jest nawet asembler tylko jeszcze niżej :(

    0 8
  • #2 19 Paź 2009 15:40
    Dżyszla
    Poziom 42  

    z przedstawionych danych wnioski:
    1. musisz znać algorytm kompresji
    2. musisz znać specyfikację protokołu komunikacyjnego
    3. musisz znać specyfikację transmisji (zależna również od typu połączenia)

    Jeśli dane są faktycznie kompresowane, to nie możesz próbować dekodować tego co widzisz w żaden sposób, gdyż najprawdopodobniej jest to kompresja strumieniowa - wyjście zmienia się w zależności od nadchodzących danych w sposób rekurencyjny.

    Jedyne co się nasuwa, to prawdopodobnie obrazy takie są kompresowane wyłącznie algorytmem RLE, jednak ilość ich odmian i sposób implementacji już same w sobie utrudniają zadanie.

    Podsumowując - ręcznie na piechotę tego nie rozgryziesz raczej. Najlepiej, jakbyś posiadł stosowne dokumentacje.

    0
  • #3 19 Paź 2009 19:53
    silvvester
    Poziom 24  

    Dżyszla napisał:
    z przedstawionych danych wnioski:
    1. musisz znać algorytm kompresji
    2. musisz znać specyfikację protokołu komunikacyjnego
    3. musisz znać specyfikację transmisji (zależna również od typu połączenia)

    Podsumowując - ręcznie na piechotę tego nie rozgryziesz raczej. Najlepiej, jakbyś posiadł stosowne dokumentacje.


    Dane są przechwycone prawidłowo , na początku bawiłem się ft232 tam trzeba się domyślać jakie są parametry transmisji , dopiero jak zamieniłem układy na ft245 ruszyłem co nieco .
    Kombinuję tak że najpierw robię plik bmp , gdzie mam np. linie o szerokości 1 piksela
    czarnego i jednego białego , linie grube , negatyw i gdy dane są wysyłane to wklejam to do worda i próbuje coś skojarzyć .


    Narazie kombinuję tak jak na rysunku jedna kratka jeden piksel , im linie są cieńsze tym wartości po lewej stronie rysunku są mniejsze .
    To co jest na rysunku to jest wycinek bitmapy 1016x1016 pikseli ,
    na samym dole są same 240 i to odpowiada ok 1000 pikselom białym ,
    tak jak pisałem wcześniej wydaje mi się że bit zerowy ustawiony odpowiada za piksele
    czarne a jeśli jest wyzerowany to piksele są białe czyli laser wygaszony .

    Problem to brak proporcjonalności pomiędzy wartościami liczbowymi a ilością pikseli , jak narysuję na przemian linie 100 pikseli białych , 100 czarnych , 100 białych itp , to mam różnicę 20-50% .

    0
  • #5 19 Paź 2009 21:41
    jestam
    Specjalista Automatyk

    Do podglądania transmisji przez porty możesz użyć http://live.sysinternals.com/portmon.exe

    Do problemu można też podejść od drugiej strony. Wskazówki do sposobu kodowania można czasem znaleźć analizując program wysyłający dane. Potrzebny jest Process Monitor z Sysinternals, debugger, publiczne symbole dla funkcji Windows i dużo wolnego czasu.

    Jesteś pewien że gra warta świeczki?

    0
  • #6 29 Paź 2009 00:55
    silvvester
    Poziom 24  

    Urządzonko takie już miałem niestety wysypało się po roku użytkowania
    nowe to koszt > 30tys. dla mnie to niestety zapora .
    Jak będę miał trochę czasu to pobawię sie ollydebugerem :) a jak nie to trzeba będzie rzeźbić w c++ od zera .

    Dzięki za pomoc na tym zakończymy , temat wyczerpany :)

    0
  • #7 29 Paź 2009 01:18
    gucio1
    Poziom 12  

    nie wiem czy to Ci pomoże...
    czwarty bit pokrywa sie z kolorem

    szósty jakby sygnalizował przejęcie biały czarny...

    0
  • #8 29 Paź 2009 05:56
    skynet_2
    Poziom 26  

    Jak chcesz się bawić debuggerem to tylko IDA Link

    Odkodowanie danych binarnych

    Masz strukturę programu w postaci drzewa co bardzo ułatwia szukanie interesującego cię fragmentu.

    A co do tematu to wrzuć więcej danych, jaka rozdzielczość X/Y, czy obraz jest skalowany czy nie?
    Poza tym co to ma być?
    Odkodowanie danych binarnych
    tablica zmiennych nie jest zsynchronizowana z "bitmapą".

    Promień wiązki lasera porusza się w poprzek tych linii?

    I najważniejsze daj dużo więcej danych np. cały plik zawierający bitmapę i całą transmisje.

    0
  • #9 24 Sty 2010 13:12
    silvvester
    Poziom 24  

    Trochę już rozgryzłem .
    Tak upraszczając to kompresja jest bardzo prosta .
    Bit 0 odpowiada za to czy laser jest włączony czy wyłączony
    Bity od 1 do 7 odpowiadają za ilość naświetlonych bądź nie naświetlonych pikseli
    np :

    00000010 to jeden piksel biały
    00000011 jeden czarny

    00000100 2 piksele białe
    00000101 2 piksele czarne

    00000110 4 białe
    00000111 4 czarne

    00001000 8 białych
    00001001 8 czarnych

    00001010 16 białych
    00001011 16 czarnych

    Czyli przy zwiększaniu wartości bitów (1bit-7bit) o 1 , mamy zwiększoną liczbę pikseli
    x2 .

    Jest jeszcze nagłówek dla każdej linii ale to jest już proste .
    Trzeba tylko puścić obrazek w odpowiedniej rozdzielczości i wszystko układa się w logiczną całość .

    0