ASCII в Binary і Binary в ASCII інструменти перетворення?


31

Який хороший інструмент для перетворення ASCII у бінарний, а двійковий у ASCII?

Я сподівався на щось на кшталт:

$ 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

Або, більш реалістичне:

$ 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

А також зворотне:

$ 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: Я використовую bash

PS2: Я сподіваюся, що я не отримав неправильний бінарний файл


Чи можете ви опублікувати те, що ви в кінцевому рахунку хочете зробити з цим? Просто будь-яке рішення, яке ми надаємо, скоріш за все працює лише у випадку вузького використання, і я розумію, що ви будете просити щось, що ви хочете використовувати більш складний спосіб, і будь-які надані рішення, ймовірно, не зможуть за таким сценарієм.
slm

@slm done, я редагував питання
RSFalcon7

Я вважаю, ви хочете проігнорувати вихідний сигнал LF echo.
Stéphane Chazelas

Найкращий спосіб зрозуміти це - те, що все є двійковим. Що ви намагаєтеся зробити, це створити рядок ascii з двійкових цифр, які представляють двійкові файли вихідного кодованого повідомлення ascii. Тому не має значення, що оригінал кодується ascii (ну майже, поки він є). Тепер вам просто потрібен інструмент, який може друкувати двійкове зображення як текст. (вже є відповідь, щоб розповісти як).
ctrl-alt-delor

Відповіді:


36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionоцінити даний вираз як perlкод
  • -p: sedрежим. Вираз обчислюється для кожного рядка введення, з вмістом рядка , що зберігається в $_змінної і надрукованій після оцінки експресії .
  • -l: навіть більше схоже sed: замість повного рядка міститься лише вміст рядка (тобто без розмежувача рядка) $_(а новий рядок додається на виході). Так perl -lpe codeпрацює як sed codeвиняток, що це perlкод на відміну від sedкоду.
  • unpack "B*"працює за $_змінною за замовчуванням і витягує її вміст у вигляді бітового рядка, що йде від найвищого біта першого байта до найнижчого біта останнього байта.
  • packробить реверс unpack. Детальніше perldoc -f packдив.

З пробілами:

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

(передбачається, що вхід знаходиться в блоках з 8 біт (0-padded)).

З unpack "(B8)*", ми витягуємо 8 біт за один раз і з'єднуємо отримані рядки з пробілами join " ".


Велике дякую. Я дещо знайомий з perl, але розширені деталі будуть дуже корисними для тих, хто абсолютно новий.
Йокай

23

Ви можете використовувати xxdдля перетворення з ASCII та бінарних.

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

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

Перетворення основ

Якщо ви хочете робити лише базові перетворення між Hex, Octal та Dec, я зазвичай використовую основний інструмент командного рядка калькулятора ( bc) для таких дій. Зауважте, що bcзавжди дуже вибагливий щодо правильного порядку баз: спочатку потрібно вказати отриману базу ( obase), а потім додати свій вибір ibase.

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

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

xxdБуло б добре, хіба що це показує, що перший дратує стовпчик і базовий вхід в кінці рядка.
RSFalcon7

@ RSFalcon7 - Я знаю, ви можете передати це, щоб awkпозбутися від нього, але, здається, немає комутаторів для відключення цього дисплея. | awk '{print $2}'. Є й інші інструменти. od& hexdump. Я шукаю інший метод, використовуючи ці.
slm

1
@ RSFalcon7 використовуйте -pопцію, щоб отримати "чистий" вихід
Pureferret

Я використовую сам xxd -bпідхід, однак, не можна використовувати xxdпоодинці, щоб перетворити бінарне назад в ASCII. Тодо, боюся, вам доведеться використовувати щось на зразок printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, з $ n, що містить число для перетворення, або як довгий рядок цифр, або рядки цифр, розділені напівколонами. Якщо ви можете гарантувати, що $ n вписується в арифметичний тип ваших снарядів, тоді ви можете пітиprintf '%x\n' $((2#$n)) | xxd -p -r
Franki

Якщо ви не можете використовувати щось на кшталт perl / python
Franki

8

Використання bc та 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

Рішення оболонки для перетворення двійкового в 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
Це не чистий розчин оболонки. sed, trі bcє зовнішніми програмами, що викликаються в скрипті оболонки.
Йокай

4

У Python

Для символів ASCII в діапазоні [ -~]на Python 2:

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

У зворотному напрямку:

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

У Python 3.2+:

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

У зворотному напрямку:

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

2

Використання 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'")

Збережено як "bin2ascii", наприклад:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!

0

Кодування двійкового по base64

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

Розшифровка бази64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.