Bash 分解长字符串,然后将十六进制转换为十进制

Bash 分解长字符串,然后将十六进制转换为十进制,bash,awk,hex,Bash,Awk,Hex,从另一个输出中,我有一个长字符串: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033B2E3C9FD0803CE800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

从另一个输出中,我有一个长字符串:

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033B2E3C9FD0803CE800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

需要将其分解为64个字符的部分:

0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000033B2E3C9FD0803CE8000000
000000000000000000000000000000000000000D610B7305BB52FC30A0000000
000000000000000000000000AF298D050E4395D69670B12B7F41000000000000
0000000000000000000000000000000000000000000000000000000000000000
然后,每一行都需要从十六进制转换为十进制,比如echo“obase=10;ibase=16;$hexNum”| bc

六边形部分很容易解决。我怀疑长字符串的“awk”操作可以将其分解为5个变量。。上面的bc命令可以转换为十进制。

这里有一种方法:

input='000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
部分=()nums=()
而[[-n$input]];do parts+=(“${input:0:64}”);input=${input:64};完成
用于“${parts[@]}”中的h;do nums+=($(echo“obase=10;ibase=16;$h”| bc));完成
声明-p部件NUM
declare-a parts=([0]=“0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033B2E3C9FD0803CE8000000”[2]=“00000000000000000000000000000000000000000D610B7305BB52FC30A0000000”[3]=“00000000000000000000000000000000000AF298D050E4395D6970B12B7F41000000000”[4]="0000000000000000000000000000000000000000000000000000000000000000")
声明-a nums=([0]=“0”[1]=“10000000000000000000000000”[2]=“1060000000000000000000000000000”[3]=“10000000000000000000000000000000000000000000000000000000000000000000000000000000000”[4]=“0”)
如果不需要保留64位十六进制数,一个循环就足够了:

nums=()
对于((i=0;i这里有一种方法:

input='000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
部分=()nums=()
而[[-n$input]];do parts+=(“${input:0:64}”);input=${input:64};完成
对于“${parts[@]}”中的h;do nums+=($(echo“obase=10;ibase=16;$h”| bc));完成
声明-p部件NUM
declare-a parts=([0]=“0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033B2E3C9FD0803CE8000000”[2]=“00000000000000000000000000000000000000000D610B7305BB52FC30A0000000”[3]=“000000000000000000000000000000 AF298D050E4395D6970B12B7F41000000000”[4]=”0000000000000000000000000000000000000000000000000000000000000000")
声明-a nums=([0]=“0”[1]=“10000000000000000000000000”[2]=“1060000000000000000000000000000”[3]=“10000000000000000000000000000000000000000000000000000000000000000000000000000000000”[4]=“0”)
如果不需要保留64位十六进制数,一个循环就足够了:

nums=()
对于((i=0;i另一种溶液

$ fold -w64 file | awk '{print strtonum("0x"$1)}'

0
1000000000000000013287555072
1060000000000000004189203726336
1000000000000000043845843045076197354634048000000
0
另一个解决方案

$ fold -w64 file | awk '{print strtonum("0x"$1)}'

0
1000000000000000013287555072
1060000000000000004189203726336
1000000000000000043845843045076197354634048000000
0

另一种方法是使用
read-n64…
一次读取64个字符,例如

读取时-n64行&[“${line}”-eq 64];执行
回音$线

echo“value$(bc另一种方法是使用
read-n64…
一次读取64个字符,例如

读取时-n64行&[“${line}”-eq 64];执行
回音$线

echo“value$(bc最后,我将字符串设置为变量(dc) 然后


最后,我将字符串设置为变量(dc) 然后


您可能需要
split-b64
?您可能需要
split-b64
?转换后的值似乎是四舍五入的。嗯……我没有意识到这一点。这似乎是
obase/ibase
bc
转换的结果,并与@glennjackman得到的结果相匹配。我必须看看那里发生了什么。考虑到值的数量级超过了64位数字,很明显,一个大数字的计算已经完成。我也不确定我的版本是否正确,但数字不可能是10的精确幂。我完全同意你关于
:)
转换后的值似乎是四舍五入的。嗯……我没有意识到这一点。这似乎是
obase/ibase
bc
进行转换的结果,并与@glennjackman得到的结果相匹配。我必须看看那里发生了什么。考虑到这些值在数量级上超过了64位数字,这显然是一个大问题-数字计算已经完成。我也不确定我的版本是否正确,但数字不可能是10的精确幂。我完全同意你关于
:)