Shell

使用“mawk”將 HEX 轉換為 DEC 超出範圍

  • January 21, 2022

當十六進制數相對較小時,我可以使用

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變數的值,後跟兩個向上箭頭/插入符號

引用自:https://unix.stackexchange.com/questions/684925