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

时间:2010-09-09 08:38:38

标签: sed hex

如何在sed之后使用管道将我的Hex值转换为Dec值。

从'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

但我很好奇这是否可以用一条线?

3 个答案:

答案 0 :(得分:1)

tr之前执行sedsed添加ibase=16;,然后将其全部加入bc

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

如果您使用的是Bash,ksh或zsh,则不需要trbc

(( dec_value = 16#$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g') ))

或没有echosed

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

答案 1 :(得分:1)

这是一个解决方案,它不会出现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中,您可以使用((...))

答案 2 :(得分:0)

bc接受所有上限。假设您可以提供所有上限:

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

打印1099999

否则,如果您在转换前运行bc,则会打印99990901