Rozwiązałem wyzwanie, w którym znalazłem plik danych bez rozszerzenia. Do file
podaje komunikat, że jest data file (application/octet-stream)
. hd
Podaje komunikat PNB. w ostatniej linii. Więc jeśli odwrócę ten plik, to otrzymam plik w formacie .PNG , szukałem wszędzie, ale nie znalazłem rozwiązania wyjaśniającego, jak odwrócić zawartość pliku binarnego.
11
W
zsh
(jedyna powłoka, która może wewnętrznie radzić sobie z danymi binarnymi (chyba że chcesz rozważyć podejście do kodowania base64 w ksh93 )):LC_ALL=C
: znaki są bajtami$mapfile[file.gnp]
: treśćfile.gnp
plikus::
: podziel ciąg na składniki bajtoweOa
: odwróćO
rder naa
rrayu indeksuj tę tablicęźródło
zsh
nie jest jedyną powłoką, która może obsługiwać dane binarne.Oto jeden ze sposobów odwrócenia pliku binarnego za pomocą
ksh93
. Zostawiłem „luźny” kod, aby ułatwić zrozumienie.źródło
read
powyżej nie powinno czytać nic, ponieważ odbywa się to na końcu pliku.strace
iksh93
wydaje się, że zachowuje się bardzo dziwnie, gdy szuka w dowolnym miejscu pliku i odczytuje duże ilości w tym czasie. Może wariant github.com/att/ast/issues/15strace
skrypt, aby zobaczyć, co mam na myśli.ksh93
czyta pliki tysiące razy. Na przykład przed odczytaniem pierwszego bajtu szuka 64 KB na końcu pliku, odczytuje 64 KB, a następnie szuka ostatniego bajtu i odczytuje 1 bajt i robi coś podobnego dla każdego bajtu. Zauważ, że to, co możesz zrobić z tymi ciągami kodowanymi base64, jest ograniczone, więc jeśli czytasz więcej niż jeden bajt na raz, trudniej będzie wyodrębnić poszczególne bajty tego.Z perlem:
Test wydajności:
Wynik:
perl -0777 -F
jest najwolniejsze.xxd
jest najwolniejsze.Uwaga:
diff
bieg czasu powinien być taki sam dla wszystkich rozwiązań, ponieważ dane wyjściowe powinny być takie same.źródło
perl
. Nie zdawałem sobie wtedy sprawy z tego, żereverse
może również odwracać łańcuchy, więc dzielenie nie miało większego sensu, a twoja wersja jest znacznie lepsza.Próbowałem następujące:
Chodzi o to, aby wymusić „tac” przy użyciu dowolnego znaku jako separatora. Próbowałem tego na pliku binarnym i wydawało się, że działa, ale każde potwierdzenie będzie mile widziane.
Główną zaletą jest to, że nie ładuje pliku do pamięci.
źródło
tac
8.28), gdy dane wejściowe zawierają znaki nowego wiersza.printf '1\n2' | tac -rs . | od -vAn -tc
wyjścia\n 2 1
zamiast2 \n 1
. Będziesz także potrzebowałLC_ALL=C
lub.
mógł dopasować znaki wielobajtowe.LC_ALL=C tac -rs $'.\\|\n'
wydaje się jednak działać.