Alat konversi ASCII ke Binary dan Binary to ASCII?

31

Yang merupakan alat yang baik untuk mengkonversi ASCII ke biner, dan biner ke ASCII?

Saya berharap untuk sesuatu seperti:

$ 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

Atau, lebih realistis:

$ 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

Dan juga sebaliknya:

$ 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: Saya menggunakan bash

PS2: Saya harap saya tidak mendapatkan biner yang salah

RSFalcon7
sumber
Bisakah Anda memposting apa yang akhirnya ingin Anda lakukan dengan ini? Hanya b / c solusi apa pun yang kami berikan kemungkinan hanya akan berfungsi untuk kasus penggunaan yang sempit, dan saya rasa Anda akan meminta sesuatu yang ingin Anda gunakan dengan cara yang lebih kompleks, dan solusi apa pun yang diberikan kemungkinan akan gagal dalam skenario itu.
slm
@slm selesai, saya mengedit pertanyaan
RSFalcon7
Saya kira Anda ingin mengabaikan hasil karakter LF echo.
Stéphane Chazelas
Cara terbaik untuk memahami ini adalah semuanya adalah biner. Apa yang Anda coba lakukan adalah menghasilkan string ascii digit biner yang mewakili biner dari pesan kode ascii asli. Oleh karena itu tidak relevan bahwa aslinya adalah kode ascii (yah hampir, asalkan itu). Sekarang Anda hanya perlu alat yang dapat mencetak biner sebagai teks. (sudah ada jawaban untuk memberi tahu Anda caranya).
ctrl-alt-delor

Jawaban:

36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionmengevaluasi ungkapan yang diberikan sebagai perlkode
  • -p: sedmode. The ekspresi dievaluasi untuk setiap baris masukan, dengan isi garis disimpan dalam $_variabel dan dicetak setelah evaluasi ekspresi .
  • -l: bahkan lebih seperti sed: alih-alih baris penuh, hanya isi baris (yaitu, tanpa pembatas baris) di $_(dan baris baru ditambahkan kembali pada output). Jadi perl -lpe codeberfungsi seperti sed codekecuali bahwa itu perlkode yang bertentangan dengan sedkode.
  • unpack "B*"bekerja pada $_variabel secara default dan mengekstrak isinya sebagai string bit berjalan dari bit tertinggi dari byte pertama ke bit terendah dari byte terakhir.
  • packmelakukan kebalikan dari unpack. Lihat perldoc -f packdetailnya.

Dengan spasi:

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

(mengasumsikan input dalam blok 8 bit (0-empuk)).

Dengan unpack "(B8)*", kami mengekstrak 8 bit sekaligus, dan kami menggabungkan string yang dihasilkan dengan spasi bersama join " ".

Stéphane Chazelas
sumber
Terimakasih banyak. Saya agak akrab dengan perl tetapi rincian yang diperluas akan sangat membantu bagi mereka yang benar-benar baru untuk perl.
Yokai
23

Anda dapat menggunakan xxduntuk mengonversi dari ASCII dan biner.

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

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

Basis konversi

Jika Anda ingin melakukan konversi basis antara Hex, Octal, & Dec Saya biasanya menggunakan alat baris perintah kalkulator dasar ( bc) untuk melakukan hal-hal seperti itu. Perhatikan bahwa bcselalu sangat pilih-pilih tentang urutan basis yang benar: Anda harus menentukan basis yang dihasilkan ( obase) terlebih dahulu, lalu tambahkan pilihan Anda ibase.

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

$ echo "obase=16; ibase=2; 1010" | bc
A
slm
sumber
xxdakan lebih baik, kecuali itu menunjukkan bahwa kolom pertama yang mengganggu dan input dasar di akhir baris.
RSFalcon7
@ RSFalcon7 - Saya tahu, Anda dapat menyalurkannya ke awkuntuk menyingkirkannya tetapi tampaknya tidak memiliki sakelar untuk menonaktifkan tampilan ini. | awk '{print $2}'. Ada alat-alat lain juga. od& hexdump. Saya mencari metode lain menggunakan itu.
slm
1
@ RSFalcon7 menggunakan -popsi untuk mendapatkan output 'murni'
Pureferret
Saya menggunakan xxd -bpendekatan itu sendiri, namun, tidak ada yang bisa digunakan xxdsendiri untuk mengubah biner kembali ke ASCII. Jadi, saya khawatir Anda harus menggunakan sesuatu seperti printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, dengan $ n berisi angka untuk dikonversi, baik sebagai string panjang digit, atau string digit dipisahkan dengan semi-titik dua. Jika Anda dapat menjamin bahwa $ n cocok dengan tipe aritmatika shell Anda, maka Anda dapat pergi denganprintf '%x\n' $((2#$n)) | xxd -p -r
Franki
Kecuali Anda dapat menggunakan sesuatu seperti perl / python
Franki
8

Menggunakan bc dan 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
sumber
5

Solusi Shell untuk mengkonversi biner ke 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
sumber
2
Ini bukan solusi shell murni. sed,, trdan bcmerupakan program eksternal yang disebut dalam skrip shell.
Yokai
4

Dengan Python

Untuk karakter ASCII dalam rentang [ -~]pada Python 2:

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

Kebalikan:

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

Dengan Python 3.2+:

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

Kebalikan:

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

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

Disimpan sebagai "bin2ascii" misalnya:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!
Vishtar
sumber
0

Pengkodean biner oleh base64

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

Decoding base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Seperti
sumber