2016-04-01 66 views
4

鑑於:轉換32/64位數量4/8字符串

$ printf "love" | od -td4 -A n 
    1702260588 
$ printf "lovehate" | od -td8 -A n 
    7310575196135911276 

是否有一個簡明(最好不循環時,awk,sed的,Perl或Python)的方式中的Bash將數字轉換17022605887310575196135911276lovelovehate分別是?

+0

快速拋開:'-A'帶有_single_-character選項參數;你可能的意思是'-A n'(儘管在實踐中GNU和BSD/OSX'od'都接受並且安靜地忽略了其他字符,這樣你就可以創造性地使用了,例如:'od -td4 -A xoxo';'od -td4- a dorky';'od -td4 -A oho';'od -td4 -A notsofast')。 – mklement0

+0

@ mklement0:很對,謝謝指出。 –

回答

4

這就是我想出了:

alpha() { 
    (($1)) && printf "\x"$(printf "%02x" $(($1%256)))$(alpha $(($1/256)))"\n" 
} 

alpha 1702260588 
alpha 7310575196135911276 

輸出:

love 
lovehate 

編輯:下面是一個使用xxd實用的答案:

# The echo is only necessary to get a newline at the end. 
echo $(printf "%x" 1702260588 | xxd -r -p | rev) 
echo $(printf "%x" 7310575196135911276 | xxd -r -p | rev) 

輸出:

love 
lovehate 
+1

對這些基本工具有非常好的理解,但似乎並不像調用awk更高效。 Upvote肯定,但「孩子們,不要依靠這種方法在家裏進行大規模處理」;-)祝大家好運。 – shellter

+1

我同意,但OP要求沒有循環,awk,sed,perl或python。舉個例子,我使用遞歸的唯一原因是因爲他要求沒有循環。這有點欺騙,但我只是試圖回答這個問題。 –

+0

理想情況下沒有循環,awk,sed,perl或python ...和遞歸! :)其實,我認爲這很整潔,雖然我很希望有人會告訴我一個很容易做到這一點的鮮爲人知的實用工具。同意upvote。 –