Narzędzia do konwersji ASCII do Binarnych i Binary do ASCII?

31

Jakie jest dobre narzędzie do konwersji ASCII na binarne, a binarne na ASCII?

Miałem nadzieję na coś takiego:

$ echo --binary "This is a binary message"
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101

Lub bardziej realistycznie:

$ echo "This is a binary message" | ascii2bin
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101

A także odwrotnie:

$ echo "01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101" | bin2ascii
This is a binary message

PS: Używam bash

PS2: Mam nadzieję, że nie dostałem złego pliku binarnego

RSFalcon7
źródło
Czy możesz opublikować, co ostatecznie chcesz z tym zrobić? Tylko b / c wszelkie oferowane przez nas rozwiązania prawdopodobnie będą działać tylko w wąskim przypadku użycia, i mam wrażenie, że poprosisz o coś, czego będziesz chciał użyć w bardziej złożony sposób, a wszelkie dostarczone rozwiązania prawdopodobnie zawiodą w tym scenariuszu.
slm
@slm gotowe, edytowałem pytanie
RSFalcon7
Rozumiem, że chcesz zignorować wynik postaci LF echo.
Stéphane Chazelas,
Najlepszym sposobem na zrozumienie tego jest to, że wszystko jest binarne. To, co próbujesz zrobić, to utworzyć ciąg ascii cyfr binarnych, które reprezentują plik binarny oryginalnej zakodowanej wiadomości ascii. Dlatego nie ma znaczenia, że ​​oryginał jest zakodowany w ascii (prawie tak długo, jak jest). Teraz potrzebujesz tylko narzędzia, które może wydrukować plik binarny jako tekst. (są już odpowiedzi, aby powiedzieć ci, jak).
ctrl-alt-delor

Odpowiedzi:

36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionoceń podane wyrażenie jako perlkod
  • -p: sedtryb. Ekspresja jest obliczane dla każdej linii wejścia, z zawartością linii przechowywanej w $_zmiennej i drukowanej po oceny ekspresji .
  • -l: jeszcze bardziej jak sed: zamiast pełnego wiersza znajduje się tylko zawartość wiersza (to znaczy bez ogranicznika wiersza) $_(i nowa linia jest dodawana z powrotem na wyjściu). Więc perl -lpe codedziała tak, sed codeże jest to perlkod w przeciwieństwie do sedkodu.
  • unpack "B*"$_domyślnie działa na zmiennej i wyodrębnia jej zawartość jako ciąg bitów przechodzących od najwyższego bitu pierwszego bajtu do najniższego bitu ostatniego bajtu.
  • packrobi odwrotność unpack. Zobacz perldoc -f packszczegóły.

Ze spacjami:

$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB

(zakłada, że ​​wejście jest w blokach po 8 bitów (wypełnienie 0).

Za pomocą unpack "(B8)*"wyodrębniamy 8 bitów na raz i łączymy powstałe ciągi ze spacjami za pomocą join " ".

Stéphane Chazelas
źródło
Wielkie dzięki. Jestem trochę obeznany z Perlem, ale rozszerzone szczegóły będą bardzo pomocne dla osób całkowicie nowych w Perlu.
Yokai,
23

Możesz użyć xxddo konwersji z ASCII i binarnego.

$ echo -n "A" | xxd -b
0000000: 01000001                                               A

$ echo -n "A" | xxd -b | awk '{print $2}'
01000001

Konwertowanie baz

Jeśli chcesz wykonać tylko podstawowe konwersje między Hex, Octal i Dec, zwykle używam podstawowego narzędzia wiersza poleceń kalkulatora ( bc) do takich rzeczy. Zauważ, że bczawsze bardzo wybredna jest poprawna kolejność baz: najpierw musisz określić wynikową bazę ( obase), a następnie dodać swój wybór ibase.

$ echo "obase=2; ibase=16; A" | bc
1010

$ echo "obase=16; ibase=2; 1010" | bc
A
slm
źródło
xxdbyłoby miło, z tym wyjątkiem, że pokazuje pierwszą irytującą kolumnę i wejście podstawowe na końcu wiersza.
RSFalcon7,
@ RSFalcon7 - Wiem, możesz go potokować, aby awksię go pozbyć, ale wydaje się, że nie ma przełączników, aby wyłączyć ten ekran. | awk '{print $2}'. Są też inne narzędzia. od& hexdump. Szukam innej metody przy użyciu tych.
slm
1
@ RSFalcon7 użyj -popcji, aby uzyskać „czysty” wynik
Pureferret
Sam używam tego xxd -bpodejścia, jednak nie można używać go xxdsamego do konwersji pliku binarnego z powrotem na ASCII. Todo więc, obawiam się, że musiałbyś użyć czegoś takiego printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, z $ n zawierającym liczbę do konwersji, albo jako długi ciąg cyfr, albo ciąg cyfr oddzielonych średnikami. Jeśli możesz zagwarantować, że $ n pasuje do typu arytmetycznego twoich pocisków, możesz uciecprintf '%x\n' $((2#$n)) | xxd -p -r
Franki
Chyba że możesz użyć czegoś takiego jak perl / python
Franki
8

Używanie bc i bash:

#!/bin/bash

chrbin() {
        echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}

ordbin() {
  a=$(printf '%d' "'$1")
  echo "obase=2; $a" | bc
}

ascii2bin() {
    echo -n $* | while IFS= read -r -n1 char
    do
        ordbin $char | tr -d '\n'
        echo -n " "
    done
}

bin2ascii() {
    for bin in $*
    do
        chrbin $bin | tr -d '\n'
    done
}
ascii2bin "This is a binary message"
bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
Frederik Deweerdt
źródło
5

Rozwiązanie powłoki do konwersji pliku binarnego na ascii:

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }
n.caillou
źródło
2
To nie jest czyste rozwiązanie powłoki. sed, tri bcsą programami zewnętrznymi wywoływanymi w skrypcie powłoki.
Yokai
4

W Pythonie

Dla znaków ASCII z zakresu [ -~]w Pythonie 2:

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'

W odwrotnej kolejności:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'

W Python 3.2+:

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

W odwrotnej kolejności:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'
serv-inc
źródło
2

Za pomocą Python 3:

#!/usr/bin/env python3

import sys


if __name__ == "__main__":
    if len(sys.argv) != 1 and len(sys.argv) <= 3:
        if sys.argv[1] in ('-b', '--binary'):
            n = int(sys.argv[2].replace(' ', ''), 2)
            print(n.to_bytes((n.bit_length() + 7) // 8, 'big').decode())
        if sys.argv[1] in ('-a', '--ascii'):
            print((bin(int.from_bytes(sys.argv[2].encode(), 'big')))[2:])
    else:
        print("Example: decode -b '10000001'")

Zapisane jako „bin2ascii” na przykład:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!
Vishtar
źródło
0

Kodowanie binarne przez base64

$ echo "This is a binary message" | base64
VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==

Dekodowanie base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Lubić
źródło