Shell
使用“mawk”將 HEX 轉換為 DEC 超出範圍
當十六進制數相對較小時,我可以使用
echo 0xFF| mawk '{ printf "%d\n", $1}'
將十六進制轉換為十進制。
當十六進制數很大時,
mawk
不再起作用,例如echo 0x8110D248 | mawk '{ printf "%d\n", $1 }'
輸出
2147483647
(這是錯誤的,2147483647
相當於0x7FFFFFFF
)。如何轉換更大的數字?
我有很多數字(每行一個數字,超過 10M)要處理,例如:每個
0xFF\n 0x1A\n 0x25\n
. 如何使它適用於這種場合?由xargs
? 有沒有更好的方法?xargs
真的很慢。
用於任意大數字的更好命令是
bc
. 這是一個執行轉換的函式hextodec() { local hex="${1#0x}" printf "ibase=16; %s\n" "${hex^^}" | bc } hextodec 0x8110D248 2165363272
我在這裡使用了一些看起來很奇怪的功能,它們在我使用變數時操縱它們的值:
"${1#0x}"``"$1"
-正如您所期望的,這引用了函式的第一個參數。The#
是一個修飾符(man bash
例如,請參閱 或閱讀POSIX),它從值的前面刪除以下表達式。例如,0xab12
將返回為ab12
"${hex^^}"
- 這引用"$hex"
但返回其值,其字母字元映射為大寫。(這是一個bash
擴展,所以請閱讀man bash
但不是 POSIX。)例如,12ab34
將返回為12AB34
在這兩種情況下,
{ … }
大括號都將修飾符綁定到變數;"$hex^^"
將簡單地返回$hex
變數的值,後跟兩個向上箭頭/插入符號