Mam plik instructions.txt
z zawartością:
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Jak mogę utworzyć plik binarny instructions.bin
z tymi samymi danymi co instructions.txt
. Innymi słowy, .bin
plik powinien mieć te same 192 bity, które są w .txt
pliku, z 32 bitami na linię. Używam bash na Ubuntu Linux. Próbowałem użyć, xxd -b instructions.txt
ale wyjście jest znacznie dłuższe niż 192 bity.
linux
bash
binary-files
xxd
dopamane
źródło
źródło
(standard_in) 1: syntax error
. Czy możesz wyjaśnić, do czegosyntax error
to się odnosi lub dlaczego tak się dzieje? Czy zdarza się to również na twoim komputerze?Mój oryginalny odpowiedź była błędna -
xxd
nie może zaakceptować albo-p
lub-r
z-b
...Biorąc pod uwagę, że inne odpowiedzi są wykonalne, i w interesie „ innej drogi ”, co powiesz na następujące kwestie:
Wejście
Wynik
Rurociąg Bash:
cat
- niepotrzebne, ale używane dla zachowania przejrzystościtr -d $'\n'
- usuń wszystkie znaki nowej linii z wejściaread -N 4 nibble
- wczytaj dokładnie 4 × znaki donibble
zmiennejprintf '%x' "$((2#${nibble}))"
przekonwertować nibble ze znaku binarnego na 1 × hex$((2#...))
- przekonwertuj podaną wartość z podstawy 2 (binarnie) na podstawę 10 (dziesiętnie)printf '%x'
- sformatuj podaną wartość od podstawy 10 (dziesiętnie) do podstawy 16 (szesnastkowo)xxd -r -p
- reverse (-r
) zwykły zrzut (-p
) - od szesnastkowego do surowego pliku binarnegoPyton:
<< EOF
) służy do pobierania treści do kodu Pythonacat
oraztr
- służy do uzyskania czystego (jednowierszowego) wejściarange(0, len(d), 8)
- uzyskaj listę liczb od 0 do końca ciągud
, z krokiem 8 × znaków naraz.chr(int(d[i:i+8],2))
- przekonwertuj bieżący wycinek (d[i:i+8]
) z binarnego na dziesiętny (int(..., 2)
), a następnie na surowy znak (chr(...)
)[ x for y in z]
- zrozumienie listy''.join(...)
- przekształca listę znaków w pojedynczy ciągprint(...)
- Wydrukuj toźródło
|
na końcu linii działa jak ukośnik odwrotny: polecenie przechodzi do następnej linii. W ten sposób możesz pozbyć się kilku ukośników. Nie jestem pewien, czy używanie symboli potoku po LFs było twoją świadomą decyzją. Wspominam o innym sposobie, na wypadek gdybyś nie wiedział.|
(lub przekierowania>
, operatory logiczne&&
itp.) Wyraźnie z przodu dla widoczności / przejrzystości ... być może stylistycznej / preferencji.|
jest na końcu, następny wiersz może wyglądać jak samodzielne polecenie, może być mylące. Właśnie dlatego pomyślałem, że styl może być twoją świadomą decyzją.Równie dobrze możesz opublikować to na stronie CodeGolf SE, ale oto moja alternatywna wersja Pythona (tylko na wyzwanie kopnięcia):
Zakładając, że
input.txt
zawiera dane, jest sformatowany do 32 znaków w wierszu.Używa to
struct
pakietu Python 3 i zapisuje / odczytuje do wejścia / wyjścia. (W Pythonie 2 byłoby to krótsze).źródło