ASCII İkili ve İkili ASCII dönüşüm araçları için?


31

ASCII'yi ikiliye ve ikiliyi ASCII'ye dönüştürmek için iyi bir araç hangisidir?

Gibi bir şey umuyordum:

$ 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

Veya daha gerçekçi:

$ 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

Ve ayrıca tam tersi:

$ 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: Ben bash kullanıyorum

PS2: Umarım yanlış ikili bilgiyi alamadım


Nihayetinde bununla yapmak istediğini gönderebilir misin? Sağladığımız her ne olursa olsun b / c muhtemelen sadece dar bir kullanım senaryosu için işe yarayacak ve daha karmaşık bir şekilde kullanmak isteyeceğiniz bir şey isteyeceğinize dair bir fikriniz olduğunu ve verilen tüm çözümlerin başarısız olacağına inanıyorum bu senaryoda.
slm

@slm bitti, soruyu düzenledim
RSFalcon7

Anladığım kadarıyla LF karakter çıktısını yoksaymak istiyorsun echo.
Stéphane Chazelas 5:13

Bunu anlamanın en iyi yolu her şeyin ikili olmasıdır. Yapmaya çalıştığınız şey, ascii kodlanmış orijinal mesajının ikili kodunu temsil eden bir ikili rakam dizisi üretmektir. Bu nedenle, orijinalin ascii kodlu olması önemli değildir (hemen hemen olduğu gibi). Şimdi sadece ikili dosyayı metin olarak yazdırabilecek bir araca ihtiyacınız var. (Size nasıl söyleyeceğimi anlatan bir cevap var).
ctrl-alt-delor

Yanıtlar:


36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionVerilen ifadeyi perlkod olarak değerlendirebilir
  • -p: sedmod. Sentezleme hattı depolanan içeriği ile, girişin her hat için değerlendirilir $_değişken ve değerlendirilmesi sonucunda baskılı ifade .
  • -l: hatta daha fazlası gibi sed: tam satır yerine, yalnızca satırın içeriği (satır sınırlayıcı olmadan) $_içeridedir (ve çıktıya yeni bir satır eklenir). Öyleyse , kodun aksine kod olması dışında perl -lpe codeçalışır .sed codeperlsed
  • unpack "B*"$_değişken üzerinde varsayılan olarak çalışır ve içeriğini ilk baytın en yüksek bitinden son baytın en düşük bitine kadar uzanan bir bit dizesi olarak çıkarır.
  • packtersini yapar unpack. Detaylar perldoc -f packiçin bakınız.

Boşluk ile:

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

(girişin 8 bitlik bloklar halinde olduğunu varsayar (0-pedli)).

İle unpack "(B8)*", bir defada 8 bit ayıklarız ve elde edilen dizgileri ile boşluklarla birleştiririz join " ".


Çok teşekkürler. Perl'i biraz tanıdık ama genişletilmiş detaylar perl için tamamen yeni olanlara çok yardımcı olacak.
Yokai

23

xxdASCII ve ikiliden dönüştürmek için kullanabilirsiniz .

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

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

Bazları dönüştürme

Hex, Octal ve Dec arasındaki dönüşümleri temel almak istiyorsanız, genellikle bcbu işlemleri yapmak için temel hesap makinesi komut satırı aracını ( ) kullanırım. bcBazların doğru sıralaması konusunda her zaman çok seçici olduğuna dikkat edin: önce elde edilen tabanı ( obase) belirlemeli , sonra seçiminizi eklemelisiniz ibase.

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

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

xxdilk can sıkıcı sütun ve satırın sonunda taban girişi olduğunu gösterir dışında güzel olurdu.
RSFalcon7,

@ RSFalcon7 - awkOndan kurtulmak için onu borulayabildiğinizi biliyorum ama bu ekranı devre dışı bırakacak anahtarlar yok gibi görünüyor. | awk '{print $2}'. Başka araçlar da var. od& hexdump. Bunları kullanan başka bir yöntem arıyorum.
slm

1
@ RSFalcon7 -p'saf' çıktı elde etmek için bu seçeneği kullanıyor
Pureferret

Bu xxd -byaklaşımı kendim kullanıyorum, ancak xxdikiliyi ASCII'ye dönüştürmek için tek başına kullanamıyorum . Bu yüzden, printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -rdönüştürmek için sayıyı içeren $ n değerinde uzun bir dize dizisi ya da noktalı virgülle ayrılmış bir dize dizesi gibi bir şey kullanmak zorunda kalacağınızdan korkuyorum . $ N'nin mermilerinizin aritmetik tipine uyduğunu garanti ederseniz, o zaman printf '%x\n' $((2#$n)) | xxd -p -r
kaçabilirsiniz

Perl / python gibi bir şey kullanmazsan
Franki

8

Bc ve bash kullanımı:

#!/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

İkili verileri ascii'ye dönüştüren Shell çözümü:

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

2
Bu saf bir kabuk çözümü değil. sed, trve bckabuk betiğinde çağrılan harici programlardır.
Yokai

4

Python'da

[ -~]Python 2'deki ASCII karakterleri için :

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

Geri viteste:

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

Python 3.2+ 'de:

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

Geri viteste:

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

2

Python 3'ü Kullanma:

#!/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'")

Örneğin "bin2ascii" olarak kaydedildi:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!

0

Base64 ile kodlama ikili

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

Kod çözme tabanı64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.