2011-06-09 62 views
34

覺得有點愚蠢的問這個(聽起來很基礎),但在其他地方找不到答案。我想將二進制數據轉換爲十六進制,就是說,沒有花哨的格式和所有。 hexdump看起來太聰明瞭,它「爲我過度」。我想從/ dev/random中取出x個字節,並以十六進制形式傳遞它們。在shell腳本中將二進制數據轉換爲十六進制數據?

最好,我想只使用標準的Linux工具,所以,我並不需要每一臺機器上安裝它(有很多)

+0

我不得不使用/ dev/urandom,/ dev/random只是凍結 – 2015-04-11 22:18:17

+2

@AquariusPower隨機塊,當它沒有足夠的隨機數據,而urandom沒有(IIRC循環它有什麼) – davka 2015-05-20 07:10:54

回答

50

也許使用xxd

% xxd -l 16 -p /dev/random 
193f6c54814f0576bc27d51ab39081dc 
+5

xxd是vim的一部分,所以它可能並不總是被安裝。 – 2012-07-24 22:47:00

+1

請注意,您可以使用'-c'來更改每行的字節數。不幸的是,你只能將它設置爲256,之後你需要有一些換行符。 – 2013-11-12 18:27:34

8

也許你可以用C編寫你自己的小工具,並編譯它在即時:

int main (void) { 
    unsigned char data[1024]; 
    size_t numread, i; 

    while ((numread = read(0, data, 1024)) > 0) { 
    for (i = 0; i < numread; i++) { 
     printf("%02x ", data[i]); 
    } 
    } 

    return 0; 
} 

然後從標準輸入給它:

cat /bin/ls | ./a.out 

甚至可以使用heredoc語法將這個小C程序嵌入到shell腳本中。

+3

C,對嗎?這太過分了。 – 2011-06-09 12:33:16

+1

好吧,但你必須在格式和:-) – 2011-06-09 12:34:30

+0

的行爲總是一種選擇的完全控制,但我相當肯定它之前:) – davka 2011-06-09 13:26:32

3

DD + hexdump都還將努力:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"' 
+0

謝謝,我以這種方式開始,但不能讓hexdump做我想做的事。我很確定它有我需要的選項,但在手冊頁 – davka 2011-06-09 13:24:22

+2

中找不到這個解決方案(hexdump -e'「%x」'):'\ n' - >'a' '0'),'abcde' - >'6463626165'(不正確的字節順序)。這在非隨機數據應用中可能非常糟糕! – 2012-07-24 22:43:40

19

隨着OD(GNU系統):

$ echo abc | od -A n -v -t x1 | tr -d ' \n' 
6162630a 

隨着hexdump都(BSD系統):

$ echo abc | hexdump -ve '/1 "%02x"' 
6162630a 

http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump
「視您的系統類型,其中之一或兩者這兩個實用程序將可用 - BSD系統不贊成使用hexdump,GNU系統則相反。「

+1

4年之後(我知道的並不多),大多數時候我讀了一篇關於* nix的文章,我瞭解了一些非常古老而且對我來說全新的東西。對於od來說+1,從來沒有聽說過它,即使在Cygwin上也是非常有用的。 ;-) – 2013-09-07 01:47:43

1

如果你需要一個大流(沒有換行符),你可以使用trxxd(vim的一部分)進行逐字節轉換。可以使用hexdump(posix)進行逐字轉換。

head -c1024 /dev/urandom | hexdump '-e"%x"' 

請注意,不同之處在於字節順序。

+2

使用'echo abc | hexdump -e'/ 1「%02x」「來獲得網絡順序,0爲0x0a。 – 2015-11-15 23:04:47

1

這三個命令將打印相同的(0102030405060708090a0b0c):

n=12 
echo "$a" | xxd -l "$n" -p 
echo "$a" | od -N "$n" -An -tx1 | tr -d " \n" ; echo 
echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo 

鑑於n=12$a是字節值從1到26:

a="$(printf '%b' "$(printf '\\0%o' {1..26})")" 

這可能被用來獲得$n在每個節目隨機字節值:

xxd -l "$n" -p     /dev/urandom 
od -vN "$n" -An -tx1   /dev/urandom | tr -d " \n" ; echo 
hexdump -vn "$n" -e '/1 "%02x"' /dev/urandom ; echo 
5

所有的解決方案似乎是很難記住或太複雜,我發現使用printf最短的一個:

$ printf '%x\n' 256 
100 

[編輯]

但正如評論指出,這是不想要的作者,所以以下是公平的答案。

...上面用來輸出實際的二進制數據流:

printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1) 

它做什麼:

  • 的printf '%X \ n' .... - 打印序列整數,即。 printf '%x,' 1 2 3,將打印1,2,3,
  • $(...) - 這是一種方式來獲得一些shell命令的輸出和處理它
  • cat /dev/urandom - 它輸出隨機二進制數據
  • head -c 5 - 二進制數據限制爲5個字節
  • od -An -vtu1 - 八進制轉儲命令,轉換二進制到十進制

作爲測試用例( 'a' 是61進制, 'p' 爲70進制,...):

$ printf '%x\n' $(echo "apple" | head -c 5 | od -An -vtu1) 
61 
70 
70 
6c 
65 

或測試單個二進制字節,在輸入使得到61十進制(「=」字符)以產生二進制數據('\\x%x'格式做的話),上述命令將輸出正確地三維(十進制61):

$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1) 
3d 
+0

哇,那簡單! – davka 2017-03-06 10:33:03

+0

@МалъСкрылевъ我已經更新了我的答案,你是對的,我錯過了問題的主要觀點 - 我可能正在尋找最簡單的將shell中的十進制轉換爲十六進制的方式,並且這個答案在谷歌中首先顯示。 – marcinj 2017-08-27 06:27:16

相關問題