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>
- Istnieje 685506 bajtów danych pomiędzy "wierzchołki „i” /wierzchołkami "
- te bajty zawierają jedynie aa, 0-9 i + /, który jest standardem dla base64
- Po pobraniu tych bajtów i zastosowaniu standardowego kodu bazowego64 w pythonie, odzyskuje się 513792 bajtów
- 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.
- 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
- unmodified file
- vertices binary:
- facets binary:
- Decrypted Data: To ZIP zawierający pole wierzchołki odszyfrowane i powierzchnie pola odszyfrowane (mesh2.vertices i odpowiednio mesh2.faces). Zawiera również plik siatki .stl, który można przeglądać/otwierać w wielu aplikacjach.
pliku Przykład 2
- unmodified file
- vertices binary:
- facets binary:
- Obwiednia: min [-4,6, -40,3, -7,3] max [7,5 -23,1, 2.6]
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.
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)? –
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
To jest to samo co koniec, więc przynajmniej to jest poza stołem –