2014-11-03 12 views
6

Mam kolumnę danych w tabeli SQLite przechowywaną jako obiekt typu blob. W szczególności jest serializowanym POJO (obiekt java).Wyświetlanie danych blob jako heksdump z ASCII w konsoli sqlite3

Tak czy inaczej, chciałbym go zobaczyć w konsoli SQLite jako szesnastkowej, coś jak to:

0000000000 |The correction f| 
0000000016 |or the aberratio| 
0000000032 |n of light is sa| 
0000000048 |id,.on high auth| 
0000000064 |ority, not to be| 
0000000080 | perfect even in| 
0000000096 | that most perfe| 
0000000112 |ct organ, the.ey| 
0000000128 |e..| 

wiem oświadczenie SELECT HEX(obj) FROM data WHERE rowid = 1 dostanie dane jak tylko hex, ale teraz Chcę poprowadzić go do czegoś, co da mi widok heksowy.

PS - Wiem, że dane, które próbuję wyświetlić, są binarne (serializowane POJO), ale chciałbym zobaczyć, co jest w środku jako eksperyment. Tak więc, nawet jeśli wynik końcowy jest i tak tajemniczy, proszę dać mi znać!

Aktualizacja: Próbowałem niektóre z sugestii, ale okazało się, że sqlite3 nie wyprowadza pełnego hex. Oczekuję około 500 bajtów, ale zamiast tego otrzymuję 10:

[email protected]:~# sqlite3 IceCream.db "select hex(obj) from Customers where rowid=1;" 
ACED00057372002D6564752E6761746563682E7365636C6173732E70726F6A656374322E637573746F6D65722E437573746F6D6572000000000000000102000B4C0007616464726573737400124C6A6176612F6C616E672F537472696E673B4C0012617661696C61626C65467265654974656D737400134C6A6176612F6C616E672F496E74656765723B4C00096269727468446174657400104C6A6176612F7574696C2F446174653B4C000C646973636F756E745261746571007E00024C000966697273744E616D6571007E00014C000A676F6C645374617475737400134C6A6176612F6C616E672F426F6F6C65616E3B4C00086C6173744E616D6571007E00014C000D6D6F6E74686C79506F696E747371007E00024C0013706F696E74734561726E656450657254696D657400134C6A6176612F7574696C2F486173684D61703B4C000B746F74616C506F696E747371007E00024C000876697053696E636571007E0003787200386564752E6761746563682E7365636C6173732E70726F6A656374322E73797374656D732E446174616261736553657269616C4F626A65637400000000000000010200024C000269647400104C6A6176612F6C616E672F4C6F6E673B4C00166C61737454696D654F626A6563744D6F64696669656471007E000778707372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000017371007E0009000001497757AAFB740006436172736F6E737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E000A000000007372000E6A6176612E7574696C2E44617465686A81014B59741903000078707708000001349BB816607871007E000F74000442696C6C737200116A6176612E6C616E672E426F6F6C65616ECD207280D59CFAEE0200015A000576616C7565787000740005313233205471007E000F737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000146000A6C6F6164466163746F7278703F400000770800000010000000007871007E000F70 


[email protected]:~# sqlite3 IceCream.db "select obj from Customers where rowid=1;" | hexdump -C 
00000000 ac ed 0a           |...| 
00000003 

Odpowiedz

5

Możesz uruchomić poniższy skrypt w poleceniu.

sqlite3 test.db "wybierz hex (obj) z danymi gdzie rowid = 1" >> hexdump

:) Nie jestem pewien, czy to, co trzeba.

+0

To * dwa * konwersji hex. –

+0

Nie potrzebowałem części '>> hexdump'. –

8

Powłoka sqlite3 nie może wyświetlać wartości ASCII w binarnym zrzucie danych.

Trzeba rury swoje wyjście do osobnego narzędzia:

sqlite3 test.db "SELECT MyBlob FROM MyTable WHERE ID = 42;" | hexdump -C 
sqlite3 test.db "SELECT MyBlob FROM MyTable WHERE ID = 42;" | xxd -g1 

Jednak sqlite3 konwertuje blob na sznurku, aby go wyświetlić, więc to nie będzie działać, jeśli blob zawiera zero bajtów.

Trzeba wyjściu blob jako hex, a następnie przekonwertować go z powrotem to binarne, tak aby następnie można wyświetlić go w żądanym formacie:

sqlite3 test.db "SELECT quote(MyBlob) FROM MyTable WHERE id = 42;" \ 
| cut -d\' -f2              \ 
| xxd -r -p               \ 
| xxd -g1 
+0

To dziwne, ale obiekt typu blob nie jest w pełni wyprowadzany z sqlite3. Oczekuję czegoś około 500 bajtów, ale zamiast tego otrzymuję coś w stylu 10? - Zobacz moją edycję na moje oryginalne pytanie. –

+0

Dzieje się tak dlatego, że masz dane o zerowych bajtach. Wersja sqlite3 z wiersza polecenia konwertuje wszystko na łańcuchy znaków, aby je wyświetlić; bajt zerowy kończy przedwcześnie łańcuch. Przeczytaj całą odpowiedź CL. –

Powiązane problemy