覺得有點愚蠢的問這個(聽起來很基礎),但在其他地方找不到答案。我想將二進制數據轉換爲十六進制,就是說,沒有花哨的格式和所有。 hexdump
看起來太聰明瞭,它「爲我過度」。我想從/ dev/random中取出x個字節,並以十六進制形式傳遞它們。在shell腳本中將二進制數據轉換爲十六進制數據?
最好,我想只使用標準的Linux工具,所以,我並不需要每一臺機器上安裝它(有很多)
覺得有點愚蠢的問這個(聽起來很基礎),但在其他地方找不到答案。我想將二進制數據轉換爲十六進制,就是說,沒有花哨的格式和所有。 hexdump
看起來太聰明瞭,它「爲我過度」。我想從/ dev/random中取出x個字節,並以十六進制形式傳遞它們。在shell腳本中將二進制數據轉換爲十六進制數據?
最好,我想只使用標準的Linux工具,所以,我並不需要每一臺機器上安裝它(有很多)
也許使用xxd
:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
xxd是vim的一部分,所以它可能並不總是被安裝。 – 2012-07-24 22:47:00
請注意,您可以使用'-c'來更改每行的字節數。不幸的是,你只能將它設置爲256,之後你需要有一些換行符。 – 2013-11-12 18:27:34
也許你可以用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腳本中。
C,對嗎?這太過分了。 – 2011-06-09 12:33:16
好吧,但你必須在格式和:-) – 2011-06-09 12:34:30
的行爲總是一種選擇的完全控制,但我相當肯定它之前:) – davka 2011-06-09 13:26:32
DD + hexdump都還將努力:
dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'
謝謝,我以這種方式開始,但不能讓hexdump做我想做的事。我很確定它有我需要的選項,但在手冊頁 – davka 2011-06-09 13:24:22
中找不到這個解決方案(hexdump -e'「%x」'):'\ n' - >'a' '0'),'abcde' - >'6463626165'(不正確的字節順序)。這在非隨機數據應用中可能非常糟糕! – 2012-07-24 22:43:40
當心!
hexdump
和xxd
給出不同的排序結果!
$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412
http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi:d
使用'echo -n $'\ x12 \ x34'| hexdump -e'/ 1「%x」'「以獲得相同的字節順序。 – 2015-11-16 00:14:43
隨着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系統則相反。「
4年之後(我知道的並不多),大多數時候我讀了一篇關於* nix的文章,我瞭解了一些非常古老而且對我來說全新的東西。對於od來說+1,從來沒有聽說過它,即使在Cygwin上也是非常有用的。 ;-) – 2013-09-07 01:47:43
如果你需要一個大流(沒有換行符),你可以使用tr
和xxd
(vim的一部分)進行逐字節轉換。可以使用hexdump
(posix)進行逐字轉換。
head -c1024 /dev/urandom | hexdump '-e"%x"'
請注意,不同之處在於字節順序。
使用'echo abc | hexdump -e'/ 1「%02x」「來獲得網絡順序,0爲0x0a。 – 2015-11-15 23:04:47
這三個命令將打印相同的(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
所有的解決方案似乎是很難記住或太複雜,我發現使用printf
最短的一個:
$ printf '%x\n' 256
100
[編輯]
但正如評論指出,這是不想要的作者,所以以下是公平的答案。
...上面用來輸出實際的二進制數據流:
printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)
它做什麼:
printf '%x,' 1 2 3
,將打印1,2,3,
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
我不得不使用/ dev/urandom,/ dev/random只是凍結 – 2015-04-11 22:18:17
@AquariusPower隨機塊,當它沒有足夠的隨機數據,而urandom沒有(IIRC循環它有什麼) – davka 2015-05-20 07:10:54