2012-02-22 20 views
23

Aktualizacja Oryginalny pytanie nie jest już odpowiednia kwestia tego problemu, więc mam zamiar opuścić ten sam wykazać co starałem/nauczyłem i tła. Oczywiste jest, że nie jest to tylko "wersja Base64" i jest nieco bardziej zaangażowana.Raw kodowania zmiennoprzecinkowa

Tło: Programuję w Pythonie 3.x głównie do użytku z programem Blendera o otwartym kodzie źródłowym. Jestem początkującym/amatorskim programistą poziomu, ale dobrze rozumiem duże pojęcia. Czytałem te artykuły dotyczące mojego pytania.

Problem: Mam plik binarny, który zawiera 3d siatki danych (wykazy pływaków i listy liczb całkowitych) odpowiadające współrzędnym x, y, z dla każdego wierzchołka (zmiennoprzecinkowe) i indeksy wierzchołków które tworzą powierzchnie siatki (liczby całkowite). Plik jest zorganizowany w xml'ish rodzaj uczucia ...

<SomeFieldLabel and header like info>**thensomedatabetween**</SomeFieldLabel> 

Oto przykład z „wierzchołków” pola

<Vertices vertex_count="42816" base64_encoded_bytes="513792" check_value="4133547451">685506bytes of b64 encoded data 
</Vertices> 
  1. Istnieje 685506 bajtów danych pomiędzy "wierzchołki „i” /wierzchołkami "
  2. te bajty zawierają jedynie aa, 0-9 i + /, który jest standardem dla base64
  3. Po pobraniu tych bajtów i zastosowaniu standardowego kodu bazowego64 w pythonie, odzyskuje się 513792 bajtów
  4. Jeśli można uznać, że vertex_count = "42816", powinno być 42816 * 12 bajtów potrzebnych do przedstawienia x, y, z dla każdego wierzchołek. 42816 * 12 = 513792. doskonały.
  5. Teraz, jeśli spróbuję rozpakować moje zdekodowane bajty jako 32-bitowe pływaki, dostaję śmieci ... więc coś jest ammis.

Myślę, że gdzieś jest dodatkowy krok kryptograficzny. Być może istnieje tablica translacji, szyfr rotacyjny lub jakiś szyfr strumieniowy? To dziwne, że liczba bajtów jest poprawna, ale wyniki nie są, które powinny ograniczać możliwości. Jakieś pomysły? Oto dwa przykładowe pliki z rozszerzeniem pliku zmienionym na * .mesh. Nie chcę publicznie udostępniać tego formatu plików, chcę tylko napisać importera do Blendera, aby móc korzystać z modeli.

Oto dwa przykładowe pliki. Wyodrębniłem surowy plik binarny (nie dekodowany przez b64) z pól Wierzchołki i Fasety, a także podałem informację o polu granicznym z "Przeglądarki" dla tego typu pliku dostarczonego przez firmę.
pliku Przykład 1

pliku Przykład 2

Uwagi o zakresie wierzchołków

  • Nagłówek określa vertex_count
  • Nagłówek określa base64_encoded_bytes który jest # bajtów przed kodowaniem base64 odbywa
  • Nagłówek określa „check_value”, którego znaczenie jest jeszcze do ustalenia
  • Dane w tym polu zawierają tylko standardowe znaki base64
  • Po standardowym dekodowaniu base64 dane wyjściowe mają ... length = vertex_count * 12 = base64_encoded_b ytes. Od czasu do czasu w wyjściu b64 są 4 dodatkowe bajty? -the stosunek zakodowanych/zdekodowanych bajtów wynosi 4/3, która jest także typową base64

Uwagi dotyczące pola Facets

  • Nagłówek Określa facet_count
  • The base64_encoded_bytes nagłówka, która to liczba bajtów PRZED kodowaniem base64

  • Stosunek base64_encoded_bytes/facet_count wydaje się być bardzo różny Bit . Od 1,1 do około 1,2. Oczekiwalibyśmy współczynnika 12, gdyby były kodowane jako liczby całkowite 3x4bajtowe odpowiadające wskaźnikom wierzchołków. Więc albo to pole jest compresesed lub model jest zapisywany z triangle strips lub obu: -/

Więcej podglądanie
I otworzył viewer (w edytorze hex), która jest warunkiem przez firmę, aby wyświetlić te pliki (również tam, gdzie mam informacje o ramce ograniczającej). Oto kilka fragmentów, które uważam za interesujące i które mogą posłużyć do wyszukiwania.

f_LicenseClient ... i. @ ...... m_wApplicationID ..... @ ...... f_bSiteEncryptionActive ..... @ ...... f_bSaveXXXXXXInternalEncrypted .... . @ ...... f_bLoadXXXXXXInternalEncrypted ... ¼! @ ...... f_strSiteKey .... i † ......

W LoadXXXXXXInternalEncrypted i SaveXXXXXXInternalEncrypted mam zablokowany się z nazwa firmy z XX. Wygląda na to, że zdecydowanie mamy jakieś szyfrowanie poza prostą odmianą tablicy base64.

SaveEncryptedModelToStream ................. Własna ... Pux .... model ... AC .... Stream ....

To dla mnie wygląda jak definicja funkcji zapisywania zaszyfrowanego modelu.

DefaultEncryptionMethod¼! @ ........ ÿ ....... € ... € ÿÿ.DefaultEncryptionKey € - † .... ÿ ... ÿ ..... .. € .... ÿÿ.DefaultIncludeModelData. - † .... ź ... Y ... ....... € € ÿÿ.DefaultVersion @

Ahhh ... teraz, jest interesujący. Domyślny klucz szyfrowania. Zauważ, że pomiędzy każdym z tych deskryptorów jest 27 bajtów i zawsze kończą się na "ÿÿ." Oto 24 bajty z wykluczeniem "ÿÿ". Dla mnie jest to klucz 192 bitowy ... ale kto wie, czy wszystkie 24 bajty odpowiadają kluczowi? jakieś pomysły?

80 96 86 00 18 00 00 FF 18 00 00 FF 01 00 00 00 00 00 00 80 01 00 00 00

Fragmenty kodu
celu zaoszczędzenia miejsca w tym wątku, umieścić ten skrypt w mój dropbox do pobrania. Czyta przez pole, wyodrębnia podstawowe informacje z pól wierzchołków i pól aspektów i drukuje mnóstwo rzeczy. Możesz usunąć komentarz z końca, aby zapisać blok danych w osobnym pliku, co ułatwi analizę.
basic_mesh_read.py

To jest kod, którego użyłem do wypróbowania wszystkich "rozsądnych" wariantów standardowej biblioteki base64.

+3

Czy jesteś pewien, że zakodowane wartości są 32-bitowymi zmiennymi? Jeśli tak, czy są reprezentowani przez [LSB] (http://en.wikipedia.org/wiki/Least_significant_bit) lub [MSB] (http://en.wikipedia.org/wiki/Most_significant_bit)? –

+0

Nie jestem całkowicie pewien, ale jestem dość pewny, biorąc pod uwagę stosunek bajtów do wierzchołków. Jeśli chodzi o LSB lub MSB, są to dla mnie nowe warunki, więc prowadzę dochodzenie. Wygląda na to, że jest to to samo, co endianness, ale artykuł Wiki mówi, że tak nie jest. Muszę więc otoczyć to trochę bardziej. Próbowałem rozpakować zarówno małego endiana, jak i wielkiego endiana. – patmo141

+0

To jest to samo co koniec, więc przynajmniej to jest poza stołem –

Odpowiedz

1

Nie jestem pewien, dlaczego uważasz, że wyniki nie są liczbami zmiennoprzecinkowymi. Dane wierzchołków w podanych "odszyfrowanych danych" zawierają pierwsze 4 bajty "f2 01 31 41". Biorąc pod uwagę kolejność bajtów LSB, która odpowiada wzorowi bitowemu "413101f2", który jest reprezentacją IEEE 754 wartości zmiennoprzecinkowej 11.062973. Wszystkie 4-bajtowe wartości w tym pliku są w tym samym zakresie, więc zakładam, że wszystkie są wartościami zmiennoprzecinkowymi.

+0

To prawda, "odszyfrowane dane" to spływy 4-bajtowe. Te konkretne dane zostały odszyfrowane przez aplikację innej firmy. Tak więc dane w oryginalnym pliku pochodzą z raw floats -> encrypted -> base64encoded. Moim celem jest odwrócić się. Encrypted -> raw floats, których obecnie nie mogłem zrobić. Kiedy po raz pierwszy napisałem ten wątek, pomyślałem, że jest to wariacja Base64, ale dalsze dochodzenie doprowadziło do wniosku, że jest również zaszyfrowane. Przeprosiny za zamieszanie. – patmo141

+1

Być może "dane zaszyfrowane" są tak naprawdę tylko strumieniem zmiennych w _binary_? – jpaugh