เครื่องมือแปลง 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: ฉันใช้ทุบตี

PS2: ฉันหวังว่าฉันจะไม่ได้รับไบนารีผิด


คุณสามารถโพสต์สิ่งที่คุณต้องการทำกับสิ่งนี้ในที่สุด? เพียงแค่ b / c โซลูชันใดก็ตามที่เราให้จะทำงานได้เฉพาะกับกรณีการใช้งานที่แคบและฉันเข้าใจว่าคุณจะขอสิ่งที่คุณต้องการใช้ในวิธีที่ซับซ้อนกว่าและวิธีแก้ปัญหาใด ๆ ที่ให้อาจจะล้มเหลว ในสถานการณ์นั้น
slm

@slm เสร็จแล้วฉันแก้ไขคำถาม
RSFalcon7

echoฉันจะเอามันคุณต้องการที่จะเพิกเฉยต่อการส่งออกของตัวละครโดย LF
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*"ทำงานกับ$_ตัวแปรตามค่าเริ่มต้นและแยกเนื้อหาเป็นบิตการเดินสตริงจากบิตสูงสุดของไบต์แรกไปยังบิตต่ำสุดของไบต์สุดท้าย
  • packunpackไม่ย้อนกลับของ ดู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 แต่รายละเอียดเพิ่มเติมจะมีประโยชน์มากสำหรับผู้ที่ยังไม่คุ้นเคยกับ Perl
Yokai

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ตัวเลือกในการรับเอาต์พุต 'pure'
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 / หลาม
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เป็นโปรแกรมภายนอกที่เรียกว่าในเชลล์สคริปต์
Yokai

4

ในงูหลาม

สำหรับอักขระ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.