簡體   English   中英

linux shell腳本中十六進制數的按位與以十六進制數給出輸出

[英]Bitwise AND on hexadecimal numbers in linux shell script to give output in hexadecimal number

我有兩個十六進制數,我想對它們執行 BITWISE AND 。 主要要求是我想要十六進制形式的 o/p 我做類似下面的事情

$line=0xC01234567C012345

$filter=0x07ffffff0fffffff 

echo $((16#$line&16#$filter))

expected output: 0x001234560c012345

我得到十進制格式的輸出。 此外,我正在使用 while 循環對文件中的所有條目執行上述按位 AND 運算。 如何正確地做到這一點?

我也嘗試使用 awk 來獲取十六進制數的按位與。 它工作正常,但僅適用於靜態值,但當我將文件作為輸入時它不起作用。

My code:
    awk '
        BEGIN {
           printf "(%d AND %d) = %d\n", 0xA0, 0x6, and(0xA0, 0x6)
        }
        {printf "(%x AND %x) = %d\n", $0, num2, and(num1, num2)}
        END{
           printf "(%d AND %d) = %d\n", 0xB0, 0x6, and(0xB0, 0x6)
        }
' $path/tmp3.txt

tmp3.txt里面的數據如下

0xc00c16b0b711d202
0xc00c16b4b711d20a
0xc00c16b8b711d212
0xc00c16bc7711d21a
0xc00c16c07711d224
0xc00c16d07711d244

我得到的輸出如下:

(160 AND 6) = 0
(0 AND 6) = 0
(0 AND 6) = 0
(0 AND 6) = 0
(0 AND 6) = 0
(0 AND 6) = 0
(0 AND 6) = 0
(176 AND 6) = 0

如何正確地做到這一點?

只需以十六進制格式打印輸出:

printf "%#018x\n" "$((line & filter))"

會輸出:

0x001234560c012345

筆記:

  • 如果要在 bash 算術擴展中指定基數,則必須刪除0x 因此,要么$(( 16#${line:2} ))要么讓 bash 自動檢測0x前綴並自動將數字解析為十六進制。
  • 您帖子中的行$line=0xC01234567C012345$filter=0x07ffffff0fffffff無效 - 您不能分配給參數擴展的結果。
  • 不需要在算術擴展中擴展變量的$
  • %#018x printf 格式說明符等於0x%016x 請注意#格式說明符的結果如何計入字段的寬度。
  • awk無法處理這么大的數字。 使用awk -M GNU 擴展,您可以啟用awk使用大數字庫,因此您可以這樣做: awk -M -v line=$line -v filter=$filter '{ printf "0x%016x\\n", and(strtonum(line), strtonum(filter)) }' <<<''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM