Strumenti di conversione da ASCII a binario e binario a ASCII?


31

Qual è un buon strumento per convertire ASCII in binario e binario in ASCII?

Speravo in qualcosa del tipo:

$ 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

O, più realistico:

$ 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

E anche il contrario:

$ 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: sto usando bash

PS2: spero di non aver sbagliato binario


Puoi pubblicare quello che alla fine vorresti fare con questo? B / c qualunque soluzione che forniremo probabilmente funzionerà solo per un caso d'uso ristretto, e ho la sensazione che chiederai qualcosa che vorresti usare in un modo più complesso, e qualsiasi soluzione fornita probabilmente fallirà in quello scenario.
slm

@slm fatto, ho modificato la domanda
RSFalcon7,

Presumo che tu voglia ignorare l'output del personaggio LF di echo.
Stéphane Chazelas,

Il modo migliore per capirlo è che tutto è binario. Quello che stai cercando di fare è produrre una stringa ASCII di cifre binarie che rappresentano il binario del messaggio codificato ASCII originale. Pertanto è irrilevante che l'originale sia codificato ASCII (bene quasi, purché sia). Ora hai solo bisogno di uno strumento in grado di stampare il file binario come testo. (ci sono già le risposte per dirti come).
ctrl-alt-delor

Risposte:


36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionvaluta l'espressione data come perlcodice
  • -p: sedmode. L' espressione viene valutata per ogni riga di input, con il contenuto della riga memorizzato nella $_variabile e stampato dopo la valutazione dell'espressione .
  • -l: ancora di più come sed: al posto della linea intera, solo il contenuto della linea (cioè senza il delimitatore di linea) è presente $_(e una nuova riga viene aggiunta all'output). Quindi perl -lpe codefunziona come sed codese non fosse il perlcodice al contrario del sedcodice.
  • unpack "B*"lavora sulla $_variabile per impostazione predefinita ed estrae il suo contenuto come una stringa di bit che cammina dal bit più alto del primo byte al bit più basso dell'ultimo byte.
  • packfa il contrario di unpack. Vedi perldoc -f packper i dettagli.

Con spazi:

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

(presuppone che l'ingresso sia in blocchi di 8 bit (0-padded)).

Con unpack "(B8)*"estraiamo 8 bit alla volta e uniamo le stringhe risultanti con spazi join " ".


Grazie molto. Conosco un po 'il perl, ma i dettagli estesi saranno molto utili per quelli completamente nuovi per il perl.
Yokai,

23

È possibile utilizzare xxdper convertire da ASCII e binario.

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

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

Conversione di basi

Se stai cercando di fare solo conversioni di base tra Hex, Octal e Dec, di solito uso lo strumento da riga di comando della calcolatrice di base ( bc) per fare queste cose. Nota che bcè sempre molto esigente riguardo all'ordine corretto delle basi: devi prima specificare la base risultante ( obase), quindi aggiungere la tua scelta di ibase.

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

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

xxdsarebbe bello, tranne per il fatto che mostra quella prima colonna fastidiosa e l'input di base alla fine della riga.
RSFalcon7,

@ RSFalcon7 - Lo so, puoi reindirizzarlo per awksbarazzartene, ma non sembra avere interruttori per disabilitare questo display. | awk '{print $2}'. Ci sono anche altri strumenti. od& hexdump. Sto cercando un altro metodo usando quelli.
slm

1
@ RSFalcon7 usa l' -popzione per ottenere un output 'puro'
Pureferret

Uso xxd -bio stesso l' approccio, tuttavia, non si può usare xxdda soli per riconvertire binario in ASCII. Todo, temo che dovresti usare qualcosa del genere printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, con $ n contenente il numero da convertire, sia come una lunga stringa di cifre, sia come una stringa di cifre separate da punti e virgola. Se si può garantire che $ n si inserisce nel tipo aritmetico dei vostri conchiglie, allora si può ottenere via conprintf '%x\n' $((2#$n)) | xxd -p -r
Franki

A meno che tu non possa usare qualcosa come perl / python
Franki

8

Usando bc e 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

5

Soluzione Shell per convertire i binari in ASCII:

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }

2
Questa non è una soluzione shell pura. sed, tre bcsono programmi esterni chiamati nello script della shell.
Yokai,

4

In Python

Per i caratteri ASCII nell'intervallo [ -~]su Python 2:

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

In retromarcia:

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

In Python 3.2+:

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

In retromarcia:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'

2

Utilizzando 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'")

Salvato come "bin2ascii" per esempio:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!

0

Codifica binaria di base64

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

Decodifica base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.