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


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 " ".


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

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

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; }

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'

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!

0

Pengkodean biner oleh base64

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

Decoding base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.