Công cụ chuyển đổi ASCII sang nhị phân và nhị phân sang ASCII?


31

Công cụ nào tốt để chuyển đổi ASCII thành nhị phân và nhị phân thành ASCII?

Tôi đã hy vọng cho một cái gì đó như:

$ 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

Hoặc, thực tế hơn:

$ 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

Và cũng ngược lại:

$ 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: Tôi đang sử dụng bash

PS2: Tôi hy vọng tôi đã không nhận được nhị phân sai


Bạn có thể đăng những gì cuối cùng bạn sẽ muốn làm với điều này? Chỉ cần bất kỳ giải pháp nào chúng tôi cung cấp sẽ chỉ có thể hoạt động trong trường hợp sử dụng hẹp và tôi có cảm giác bạn sẽ yêu cầu thứ gì đó mà bạn muốn sử dụng theo cách phức tạp hơn và mọi giải pháp được cung cấp sẽ thất bại trong kịch bản đó.
slm

@slm xong, tôi chỉnh sửa câu hỏi
RSFalcon7

Tôi lấy nó mà bạn muốn bỏ qua đầu ra ký tự LF echo.
Stéphane Chazelas

Cách tốt nhất để hiểu điều này là mọi thứ đều là nhị phân. Những gì bạn đang cố gắng làm là tạo ra một chuỗi ascii gồm các chữ số nhị phân đại diện cho nhị phân của thông điệp được mã hóa ascii ban đầu. Do đó, không có liên quan rằng bản gốc được mã hóa ascii (gần như, miễn là nó). Bây giờ bạn chỉ cần một công cụ có thể in nhị phân dưới dạng văn bản. (đã có câu trả lời cho bạn biết làm thế nào).
ctrl-alt-delor

Câu trả lời:


36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionđánh giá biểu thức đã cho dưới dạng perl
  • -p: sedchế độ. Các biểu hiện được đánh giá cho mỗi dòng đầu vào, với nội dung của dòng lưu trữ trong các $_biến và in sau khi thẩm định của biểu .
  • -l: thậm chí giống như sed: thay vì dòng đầy đủ, chỉ có nội dung của dòng (nghĩa là không có dấu phân cách dòng) nằm trong $_(và một dòng mới được thêm lại vào đầu ra). Vì vậy, perl -lpe codehoạt động như sed codengoại trừ perlmã đó là trái ngược với sedmã.
  • unpack "B*"hoạt động trên $_biến theo mặc định và trích xuất nội dung của nó dưới dạng một chuỗi bit đi từ bit cao nhất của byte đầu tiên đến bit thấp nhất của byte cuối cùng.
  • packkhông đảo ngược của unpack. Xem perldoc -f packđể biết chi tiết.

Với không gian:

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

(nó giả sử đầu vào ở dạng khối 8 bit (đệm 0)).

Với unpack "(B8)*", chúng tôi trích xuất 8 bit cùng một lúc và chúng tôi nối các chuỗi kết quả với khoảng trắng với join " ".


Cảm ơn nhiều. Tôi hơi quen với perl nhưng các chi tiết mở rộng sẽ rất hữu ích cho những người hoàn toàn mới với perl.
Yokai

23

Bạn có thể sử dụng xxdđể chuyển đổi từ ASCII và nhị phân.

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

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

Chuyển đổi căn cứ

Nếu bạn đang tìm cách thực hiện các chuyển đổi cơ bản giữa Hex, Octal và Dec, tôi thường sử dụng công cụ dòng lệnh máy tính cơ bản (bc ) để thực hiện những việc đó. Lưu ý rằng bcluôn rất kén chọn về thứ tự cơ sở chính xác: trước tiên bạn phải xác định cơ sở kết quả ( obase), sau đó thêm lựa chọn của bạn ibase.

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

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

xxdsẽ tốt, ngoại trừ nó cho thấy cột gây phiền nhiễu đầu tiên và đầu vào cơ sở ở cuối dòng.
RSFalcon7

@ RSFalcon7 - Tôi biết, bạn có thể đặt nó để awkloại bỏ nó nhưng dường như không có công tắc để tắt màn hình này. | awk '{print $2}'. Có những công cụ khác nữa. od& hexdump. Tôi đang tìm kiếm một phương pháp khác bằng cách sử dụng chúng.
slm

1
@ RSFalcon7 sử dụng -ptùy chọn để nhận đầu ra 'thuần'
Pureferret

xxd -bTuy nhiên, tôi sử dụng cách tiếp cận này, người ta không thể sử dụng xxdmột mình để chuyển đổi nhị phân trở lại ASCII. Todo vì vậy, tôi sợ bạn sẽ phải sử dụng một cái gì đó như printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, với $ n chứa số để chuyển đổi, dưới dạng một chuỗi dài các chữ số hoặc một chuỗi các chữ số được phân tách bằng dấu chấm phẩy. Nếu bạn có thể đảm bảo rằng $ n phù hợp với loại số học của vỏ của bạn, thì bạn có thể thoát khỏiprintf '%x\n' $((2#$n)) | xxd -p -r
Franki

Trừ khi bạn có thể sử dụng một cái gì đó như perl / python
Franki

8

Sử dụng bc và 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

Giải pháp Shell để chuyển đổi nhị phân thành 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
Đây không phải là một giải pháp vỏ tinh khiết. sed, trbclà các chương trình bên ngoài được gọi trong tập lệnh shell.
Yokai

4

Trong Python

Đối với các ký tự ASCII trong phạm vi [ -~]trên Python 2:

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

Ngược lại:

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

Trong Python 3.2+:

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

Ngược lại:

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

2

Sử dụng 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'")

Được lưu dưới dạng "bin2ascii" chẳng hạn:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!

0

Mã hóa nhị phân theo cơ sở64

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

Giải mã cơ sở64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.