十六进制到十二进制转换(带sed的管道)

十六进制到十二进制转换(带sed的管道),sed,hex,Sed,Hex,如何在sed之后使用管道将十六进制值转换为十进制值 从“litte endian”到“big endian”的转换 dec_value=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'` 更新: 这很好: endi=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g' | tr '[a-z]' '[A-Z]'` echo "ibase=16; $endi"

如何在
sed
之后使用管道将十六进制值转换为十进制值

从“litte endian”到“big endian”的转换

dec_value=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'`
更新:

这很好:

endi=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g' | tr '[a-z]' '[A-Z]'`
echo "ibase=16; $endi" | bc

但我很好奇,这是否可能只使用一行?

bc
接受所有大写字母。假设您可以提供所有CAP:

endi=`echo DEDE0A01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'`
echo "obase=10; $endi" | bc
打印
1099999


否则,如果在转换之前运行
bc
,它将打印
9990901

sed
之前执行
tr
,并让
sed
添加
ibase=16将其全部输送到
bc
之前:

dec_value=$(echo dede0a01 | tr '[a-z]' '[A-Z]' | sed 's,\(..\)\(..\)\(..\)\(..\),ibase=16;\4\3\2\1,g' | bc)
(( dec_value = 16#$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g') ))
如果您使用的是Bash、ksh或zsh,则不需要
tr
bc

dec_value=$(echo dede0a01 | tr '[a-z]' '[A-Z]' | sed 's,\(..\)\(..\)\(..\)\(..\),ibase=16;\4\3\2\1,g' | bc)
(( dec_value = 16#$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g') ))
或者也没有
echo
sed

hex=dede0a01
(( dec_value = 16#${hex:6:2}${hex:4:2}${hex:2:2}${hex:0:2} ))

这里有一个解决方案,它不适用于
bc
,只使用可移植的标准语法,不使用特定于Bash、zsh或ksh的语法:

dec_value=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g' | (read hex; echo $(( 0x${hex} )))`
或者,更简单地说:

: $(( dec_value = 0x$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g') ))

(您需要可移植的
:$(…)
$(…)
替换其结果,
允许您忽略它。在Bash和可能的ksh/zsh中,您可以使用将十六进制值dede0a01转换为十进制的
(…)

。但首先我需要将其转换为01a0eded(使用sed),然后将其转换为十进制。那么,在sed之后如何使用bc呢?您的意思是将'dede0a01'转换为'10a0eded'而不是'01a0eded',或者不转换?在转换之前使用
bc
!。最终,您将需要在.dec_value=
echo dedede0a01|sed's、\(..\)\(..\)\(..\)\(..\)\(..\)、\4\3\2\1、g'
之前或之后使用
来转换为:010adede(抱歉输入错误)。之后,我需要将其转换为17489630。那么,如何在sed之后使用管道从010adede转换为17489630呢?已尝试bc,但可以使其工作。您的十六进制代码似乎无效,因为bc接受所有大写字母。