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

发布于 2024-09-18 12:48:16 字数 398 浏览 6 评论 0原文

如何在 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

但我很好奇这是否可以用一行来实现?

How can I convert my Hex value to Dec value using pipe after sed.

Conversion from 'litte endian' to 'big endian'

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

Update:

This works fine:

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

But I'm curious whether this is possible with one line?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

箹锭⒈辈孓 2024-09-25 12:48:16

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)

如果您使用的是 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} ))

Do your tr before the sed and have sed add the ibase=16; before piping it all into bc:

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

If you're using Bash, ksh or zsh, you don't need tr and bc:

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

or without echo and sed, too:

hex=dede0a01
(( dec_value = 16#${hex:6:2}${hex:4:2}${hex:2:2}${hex:0:2} ))
枫以 2024-09-25 12:48:16

这是一个不使用 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 中,您可以只使用 ((...)))

Here's a solution that doesn't shell out to bc, and uses only portable, standard syntax, nothing Bash, zsh, or ksh specific:

dec_value=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g' | (read hex; echo $(( 0x${hex} )))`

Or, somewhat more simply:

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

(You need the : $((...)) to be portable; $((...)) substitutes its result, and the : allows you to ignore it. In Bash and likely ksh/zsh, you could just use ((...)))

叶落知秋 2024-09-25 12:48:16

bc 接受全部大写。假设您可以提供全部大写:

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

打印 1099999

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

bc accepts all caps. Assuming you can provide it all caps:

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

Prints 1099999

Else if you run bc before you convert, it prints 99990901.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文