[英]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
筆記:
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.