2012-10-31 39 views
18

Tôi có rất nhiều loại chuỗi và tôi muốn tìm lệnh để chuyển đổi nó thành ascii, tôi đã thử với echo -eod, nhưng nó không hoạt động.Biến đổi chuỗi hex thành ascii trong dòng lệnh bash

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 
+0

Điều đó trông không giống ASCII. ASCII không được định nghĩa cho các giá trị lớn hơn 0x7f. –

+0

bạn có nghĩa là đó là nhị phân? – Kerby82

+0

Bạn có nghĩa là int/binary thay vì ASCII? Các giá trị bạn đã hiển thị lớn hơn phạm vi ASCII ... –

Trả lời

12

Mã này sẽ chuyển đổi văn bản 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 thành luồng 11 byte với giá trị tương đương. Các byte này sẽ được ghi ra tiêu chuẩn.

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ') 
for c in $TESTDATA; do 
    echo $c | xxd -r 
done 

Như những người khác đã chỉ ra, điều này sẽ không dẫn đến chuỗi ASCII có thể in vì lý do đơn giản là các byte được chỉ định không phải là ASCII. Bạn cần đăng thêm thông tin về cách bạn có được chuỗi này để chúng tôi giúp bạn với điều đó.

Cách hoạt động: xxd -r dịch dữ liệu thập lục phân thành nhị phân (như hexdump ngược). xxd yêu cầu mỗi dòng bắt đầu với số chỉ mục của ký tự đầu tiên trên dòng (chạy hexdump trên một cái gì đó và xem cách mỗi dòng bắt đầu với một số chỉ mục). Trong trường hợp của chúng tôi, chúng tôi muốn con số đó luôn bằng 0, vì mỗi lần thực thi chỉ có một dòng. Như may mắn sẽ có nó, dữ liệu của chúng tôi đã có số không trước mỗi ký tự như là một phần của ký hiệu 0x. Chữ thường x được bỏ qua bởi xxd, vì vậy tất cả những gì chúng ta phải làm là đặt từng ký tự 0xhh vào xxd và để nó hoạt động.

Tr sẽ dịch các khoảng thời gian thành dấu cách sao cho dấu phân cách sẽ phân tách chính xác.

+0

không làm việc cho tôi với xxd --version = 'xxd V1.10 27oct98' trên newhat Redhat linux (với ksh). Tôi chỉ nhận được một char. – shellter

+0

Đó là chính xác những gì tôi nhận được quá. Dữ liệu không phải là văn bản, vì vậy nó không in ra rất tốt. Để xem nó ở dạng có thể in, hãy đặt mã của tôi vào một hàm bash, như danstest() {...}. Sau đó, gọi hàm và đường ống đầu ra thành hexdump -C. Điều này sẽ cho bạn thấy byte-cho-byte dữ liệu nào sắp ra khỏi mã của tôi. –

+1

tuyệt. Bạn chỉ có thể làm '... xong | hexdump -C', không cần hàm. Chúc mọi người may mắn. – shellter

1

echo -e phải không thực hiện được vì bạn đã thoát sai. Các mã sau hoạt động tốt đối với tôi vào một đầu ra tương tự từ your_program with arguments:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g') 

Xin lưu ý tuy nhiên đó hexstring gốc của bạn bao gồm các ký tự không in được.

57

Điều này phù hợp với tôi.

$ echo 54657374696e672031203220330 | xxd -r -p 
Testing 1 2 3$ 

-r nói với nó để chuyển đổi hex để ascii như trái ngược với chế độ bình thường của nó làm điều ngược lại

-p nói với nó để sử dụng một định dạng đơn giản.

+1

@BradKoch Cảm ơn bạn đã phản hồi! Tôi đã thêm một lời giải thích về các cờ dòng lệnh, điều này sẽ giúp tôi khi tôi quay lại câu hỏi này sau vì tôi quên cách thực hiện điều này. – funroll

4

Bạn có thể sử dụng một cái gì đó như thế này.

$ cat test_file.txt 
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e 

$ for c in `cat test_file.txt`; do printf "\x$c"; done; 
This is text data. 
One more line of test data. 
+0

Tôi đang cố gắng giải mã dữ liệu bí ẩn từ một trò chơi (Elite: Nguy hiểm) trông giống như số thập phân, điều này dường như hoạt động (với '\\' thay vì '\ x'). (: – seaturtle

0

Giá trị bạn cung cấp là giá trị UTF-8. Khi được đặt, mảng:

declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2) 

Sẽ được phân tích cú pháp để in các ký tự thô của mỗi giá trị.

for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done 

Và đầu ra sẽ mang lại một vài ký tự in và một số ký tự không thể in được như ở đây:

enter image description here

Để chuyển đổi các giá trị hex để bản rõ bằng cách sử dụng echo lệnh:

echo -e "\x<hex value here>" 

Và để chuyển đổi giá trị UTF-8 thành văn bản thô bằng cách sử dụng lệnh echo:

echo -e "\u<UTF-8 value here>" 

Và sau đó để chuyển đổi bát phân để bản rõ bằng cách sử dụng echo lệnh:

echo -e "\0<octal value here>" 

Khi bạn có giá trị mã hóa bạn không quen thuộc với, dành thời gian để kiểm tra các dãy trong bảng mã thông thường các lược đồ để xác định giá trị mã hóa thuộc về. Sau đó, chuyển đổi từ đó là một snap.

Các vấn đề liên quan