如何在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
但我很好奇这是否可以用一条线?
答案 0 :(得分:1)
在tr
之前执行sed
并sed
添加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,则不需要tr
和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} ))
答案 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
。