Преобразование шестнадцатеричного в декабрьское (труба с седом) - PullRequest
2 голосов
/ 09 сентября 2010

Как я могу преобразовать свое шестнадцатеричное значение в значение Dec, используя трубу после 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

Но мне интересно, возможно ли это с одной строкой?

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Сделайте 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 голос
/ 09 сентября 2010

Вот решение, которое не распространяется на 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 вы можете просто использовать ((...)))

0 голосов
/ 09 сентября 2010

bc принимает все заглавные буквы.Предполагая, что вы можете предоставить все заглавные буквы:

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

Печать 1099999

Иначе, если вы запустите bc перед преобразованием, он напечатает 99990901.

...