2012-06-20 67 views
8

Tôi đang cố gắng chuyển đổi một chuỗi các byte từ hex sang bin bằng bash. nhưng tôi cứ bị (dường như ngẫu nhiên) "(standard_in) 1: lỗi cú pháp" trả lời từ đoạn mã sau:Hex to Binary conversion in bash

for j in c4 97 91 8c 85 87 c4 90 8c 8d 9a 83 81 
do 
     BIN=$(echo "obase=2; ibase=16; $j" | bc) 
     echo $BIN 
done 

tôi đã làm một điều tương tự với tháng mười hai đến bin, hoạt động hoàn toàn tốt đẹp:

for i in {0..120} 
do 
     KEYBIN=$(echo "obase=2; ibase=10; $i" | bc) 
     echo $KEYBIN 
done 

Có ai có ý tưởng tại sao nó hoạt động với số thập phân, nhưng không phải với hex? Theo tôi cú pháp là khá nhiều như nhau (trừ khi tôi đang thiếu một cái gì đó thực sự khó khăn.)

+0

thể bản sao của [script shell linux: chuỗi hex thành byte] (https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes) –

Trả lời

13

BC là một chút nhạy cảm với trường hợp của các giá trị hex, thay đổi thành chữ hoa và nó cũng làm việc

for j in C4 97 91 8C 85 87 C4 90 8C 8D 9A 83 81 
do 
     BIN=$(echo "obase=2; ibase=16; $j" | bc) 
     echo $BIN 
done 

Output:

11000100 
10010111 
10010001 
10001100 
10000101 
10000111 
11000100 
10010000 
10001100 
10001101 
10011010 
10000011 
10000001 
+0

do đó, nó thực sự là một lỗi đơn giản. cảm ơn bạn đã chỉ ra điều này, hoạt động như một sự quyến rũ. – fragman

+0

vui lòng giúp đỡ, BC là một công cụ tuyệt vời với một số câu hỏi mà bạn chỉ cần biết :-) –

+0

Có ai biết làm thế nào để sản lượng của bc đến một số chữ số nhất định? Điều này là không cần thiết trong ví dụ trên, nhưng chỉ cần thử vòng lặp với một 00 là đầu vào. –

4

Dưới đây là kịch bản tôi sử dụng:

#!/bin/bash 
# SCRIPT: hex2binary.sh 
# USAGE: hex2binary.sh Hex_Number(s) 
# PURPOSE: Hex to Binary Conversion. Takes input as command line 
#   arguments. 
##################################################################### 
#      Script Starts Here       # 
##################################################################### 

if [ $# -eq 0 ] 
then 
    echo "Argument(s) not supplied " 
    echo "Usage: hex2binary.sh hex_number(s)" 
else 
    echo -e "\033[1mHEX     \t\t BINARY\033[0m" 

    while [ $# -ne 0 ] 
    do 
     DecNum=`printf "%d" $1` 
     Binary= 
     Number=$DecNum 

     while [ $DecNum -ne 0 ] 
     do 
      Bit=$(expr $DecNum % 2) 
      Binary=$Bit$Binary 
      DecNum=$(expr $DecNum/2) 
     done 

     echo -e "$Number    \t\t $Binary" 
     shift 
     # Shifts command line arguments one step.Now $1 holds second argument 
     unset Binary 
    done 

fi 
+0

Cẩn thận: Các số thập phân phải đứng trước '0x' và cột ** HEX ** thực sự liệt kê các giá trị thập phân. Nhưng cảm ơn bạn đã cung cấp giải pháp bash thuần túy cho câu hỏi "Cách ... trong bash"! Đôi khi đó thực sự là những gì mọi người đang tìm kiếm. Bạn không thể luôn luôn phụ thuộc vào sự hiện diện của các công cụ như bc. –

+0

phiên bản bash tôi đang sử dụng ('4.4.12') không cần tiền tố số hex. Kịch bản không xử lý đúng '0', bạn muốn thay thế' $ Binary' bằng '$ {Binary: -0}' trong lần gọi 'echo' cuối cùng – untore