2012-10-31 52 views
18

我有很多這種類型的字符串,我想要找到一個命令將其轉換爲ASCII碼,我嘗試了echo -eod,但它沒有奏效。在bash命令行中將十六進制字符串轉換爲ascii

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

這看起來不像ASCII。沒有爲大於0x7f的值定義ASCII。 –

+0

你是說它是二進制的嗎? – Kerby82

+0

你的意思是int/binary而不是ASCII?您顯示的值大於ASCII範圍... –

回答

12

該代碼將文本0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2轉換爲具有等效值的11個字節的流。這些字節將被寫入標準輸出。

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

正如其他人所指出的,這會不會導致打印的ASCII字符串原因很簡單,指定字節不是ASCII。您需要發佈更多關於您如何獲得此字符串的信息,以便我們爲您提供幫助。

工作原理:xxd -r將十六進制數據轉換爲二進制數據(如反轉的hexdump)。 xxd要求每行以行上第一個字符的索引號開始(在某物上運行hexdump並查看每行是否以索引號開頭)。在我們的例子中,我們希望這個數字總是爲零,因爲每個執行只有一行。幸運的是,我們的數據在每個字符之前已經有0個字符作爲0x符號的一部分。小寫字母x被xxd忽略,因此我們所要做的就是將每個0xhh字符傳遞給xxd並讓它完成工作。

tr將句號轉換爲空格,以便for將正確地分割它。

+0

不適用於我的xxd --version ='xxd V1.10 27oct98'在新的Redhat linux上(使用ksh)。我只得到一個字符。 – shellter

+0

這正是我得到的。數據不是文本,所以不能很好地打印出來。要以可打印的形式查看它,請將我的代碼放入bash函數中,如danstest(){...}。然後,調用該函數並將輸出傳遞給hexdump -C。這將向您顯示字節爲字節的數據來自我的代碼。 –

+1

很酷。你可以做'...完成| hexdump -C',無需功能。祝你們好運。 – shellter

1

由於錯誤轉義,echo -e肯定失敗。 下面的代碼工作正常,我在一個類似的輸出your_program with arguments

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

但是請注意,你原來的十六進制串組成的非打印字符。

57

這對我有效。

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

-r告訴它轉換十六進制的ASCII,而不是它的正常操作的方式相反

-p的模式告訴它使用普通格式。

+1

@BradKoch感謝您的反饋!我添加了對命令行標誌的解釋,這會在我稍後再回到此問題時幫助我,因爲我忘記了如何執行此操作。 – funroll

4

你可以使用這樣的東西。

$ 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

我試圖從遊戲(精英:危險),看起來像十進制解碼神祕數據,這似乎工作(與'\\'而不是'\ x')。 (: – seaturtle

0

您提供的值是UTF-8值。設置時,排列如下:

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

將被解析以打印每個值的明文字符。

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

正如這裏所示的輸出將產生一些可打印的字符和一些不可打印的字符:

enter image description here

用於將十六進制值使用echo命令到明文:

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

並使用echo命令將UTF-8值轉換爲明文:

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

然後轉換八進制使用echo命令明文:

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

當你有編碼值,你不熟悉,走的時候共通編碼檢查出的範圍方案來確定一個值屬於什麼編碼。然後從那裏轉換是一個快照。

相關問題