Odczyt pliku hex

0

Witam,

nie jestem przekonany czy to dobry dzial ale zadam to pytanie tutaj. Mianowicie:

mam plik .csv ktory zawiera dane:

23.969446,1

wczytuje go do matlaba i zapisuje jako plik .mat. Gdy otwieram ten plik w hexa costam to otrzymuje nastepujace rzeczy:


00000000: 4d41 544c 4142 2035 2e30 204d 4154 2d66  MATLAB 5.0 MAT-f
00000010: 696c 652c 2050 6c61 7466 6f72 6d3a 2050  ile, Platform: P
00000020: 4357 494e 2c20 4372 6561 7465 6420 6f6e  CWIN, Created on
00000030: 3a20 4d6f 6e20 4f63 7420 3137 2031 303a  : Mon Oct 17 10:
00000040: 3339 3a32 3420 3230 3131 2020 2020 2020  39:24 2011      
00000050: 2020 2020 2020 2020 2020 2020 2020 2020                  
00000060: 2020 2020 2020 2020 2020 2020 2020 2020                  
00000070: 2020 2020 2020 2020 2020 2020 0001 494d              ..IM
00000080: 0f00 0000 4900 0000 789c e363 6060 8800  ....I...x..c``..
00000090: 6236 20e6 80d2 20c0 0ae5 3302 3113 9416  b6 ... ...3.1...
000000a0: 07e2 60c7 2003 0323 7353 7303 4303 4b43  ..`. ..#sSs.C.KC
000000b0: 0323 2343 1343 3353 6306 4ea0 9c00 10bf  .##C.C3Sc.N.....
000000c0: b7f9 3847 f787 b903 c494 0ff6 0028 ee0b  ..8G.........(..
000000d0: 1d    

i teraz uwaga moje pytanie: Jak moge odszyfrowac dane z pliku .mat? Tzn jak dojsc do wartosci z pliku?

Rozumiem ze:

00000000: 4d41 544c 4142 2035 2e30 204d 4154 2d66  MATLAB 5.0 MAT-f
00000010: 696c 652c 2050 6c61 7466 6f72 6d3a 2050  ile, Platform: P
00000020: 4357 494e 2c20 4372 6561 7465 6420 6f6e  CWIN, Created on
00000030: 3a20 4d6f 6e20 4f63 7420 3137 2031 303a  : Mon Oct 17 10:
00000040: 3339 3a32 3420 3230 3131 2020 2020 2020  39:24 2011      
00000050: 2020 2020 2020 2020 2020 2020 2020 2020                  
00000060: 2020 2020 2020 2020 2020 2020 2020 2020                  
00000070: 2020 2020 2020 2020 2020 2020 0001 494d              ..IM

to jest nagolwek mat pliku matlaba. Po czym powinny byc wartosci w jednej komorce tabeli 23.969446 i w drugiej 1 czyli gdzies tu:

00000080: 0f00 0000 4900 0000 789c e363 6060 8800  ....I...x..c``..
00000090: 6236 20e6 80d2 20c0 0ae5 3302 3113 9416  b6 ... ...3.1...
000000a0: 07e2 60c7 2003 0323 7353 7303 4303 4b43  ..`. ..#sSs.C.KC
000000b0: 0323 2343 1343 3353 6306 4ea0 9c00 10bf  .##C.C3Sc.N.....
000000c0: b7f9 3847 f787 b903 c494 0ff6 0028 ee0b  ..8G.........(..
000000d0: 1d  

Pozdrawiam

0

Ja przestudiowalem ten plik mat file format. Wiem jak wyglada struktura mat pliku... ale nie wiem jak odczytac dane z niego. Gdyie sa moje liczby w tych krzaczkach i jak to rozszyfrowac?

dodam ze jak robie to jak pan Bog przykazal i tlumacze wprost z tabeli ASCII to glupoty otrzymuje. Wiec mniemam ze to nie tedy droga..

0

Przejrzałem na szybko tego pdfa i tam jest wszystko czego potrzebujesz. Nie patrz na te hexy :P. Najpierw ustal na którym bajcie od początku pliku jest interesująca Cię dana, a potem jakiego jest typu i już :D. Pisząc poważniej usiądź i przeanalizuj dokładnie ten dokument, bo bez tego nie mamy o czym rozmawiać.

0

dzieki za odpowiedz:) ja naprawde przestudiowalem ten plik i potrafie tworzyc w C proste pliki .mat. Ale teraz musze wiedziec jak to odczytac... niestety. Poniewaz jak tworze dane typu double w programie tworzacym mat file to nie czyta mi tego matlab. Twierdzi ze to nie sa dane binarne.

0
coyote napisał(a)

dzieki za odpowiedz:) ja naprawde przestudiowalem ten plik i potrafie tworzyc w C proste pliki .mat. Ale teraz musze wiedziec jak to odczytac... niestety. Poniewaz jak tworze dane typu double w programie tworzacym mat file to nie czyta mi tego matlab. Twierdzi ze to nie sa dane binarne.

hmm...
23.969446 we float to 0x41bfc16d, w double 0x4037f82d9cf13cef po rzutowaniu reinterpret_castem. nie ma takich ciągów bajtów w twoim pliku.
chyba najprostszą metodą będzie sprawdzenie jak radzi sobie z plikami mat octave ;)

0

no wlasnie o tym mowie:) ale ja ten plik stworzylem w matlabie i jak go otwieram w tymze programie to sa tam te dane. Wiec gdzies one musza byc w tych krzaczkach jak odczytuje to w hex.

0

Tam jest opis tekstowy w nagłówku jak widzę. Może za krótki offset dałeś i jest wszystko przesunięte o bajt. Wtedy program może też tego nie łyknąć. Zapisujesz do pliku binarnie prawda? ;)

0

Tak wydaje mi sie ze robie to poprawnie.

Ale ten plik hex co go wrzucilem w pierwszym poscie to jest "wyciag" z pliku stworzonego w matlabie. A plik matlabowy zawieral w pierwszej komorce 23.969446 a w nastepnej wartosc 1. Wiec myslalem ze podejrze sobie plik i sprawdze jak matlab zapisuje te liczby w mat pliku. I pozniej chcialem zrobic tak samo w C.

0

No dobrze. Pamiętaj, że procesory z rodziny x86 piszą i czytają w little endian, więc wszystkie dane mają bajty w odwróconej kolejności. No i musisz też wiedzieć ile bajtów zajmuje dany typ danych. Że np. w C int ma 32 bajty, to dla matlaba nie musi to być prawdą.

0

Dzieki za pomoc.

Wiem o tym. Moj program zawiera wszytkie te rzeczy lacznie z sprawdzaniem endianow. Niemniej jednak wiem juz w czym byl problem. Chodzi o to ze wersje matlaba nowsze od v6 zapisujac plik mat kompresuja go. Aby go odczytac nalezy go odkompresowac:p Dlatego tez z tego kodu hex co go wzucilem poza naglowkiem mozna odczytac tylko 4 pierwsze bajty ktore zawieraja informacje o kompresji i nastepne 4 tore mowia o ilosci bajtow uzytych do przechowywania danych. Jeszcze tego nie sprawdzilem ale sprobuje dzisiaj zapisac plik mat z matlaba bez kompresjii. Robi sie to chyba przy pomocy funkcji

save('myfile.mat', '-v6')

i po cichu licze ze to wlasnie zadziala i bede mogl odczytac plik i podejrzec jego strukture.

Jeszcze raz dzieki Sarrus;)

0

teraz wszystko dziala jak nalezy:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1