在UNIX shell脚本中将十进制转换为十六进制

ski*_*ppy 102 unix shell hex

在UNIX shell脚本中,我可以使用什么来将十进制数转换为十六进制数?我认为od可以解决这个问题,但它没有意识到我正在为它提供数字的ASCII表示.

printf的?毛!现在使用它,但还有什么可用吗?

Kel*_*tia 176

试过printf(1)

printf "%x\n" 34
22
Run Code Online (Sandbox Code Playgroud)

有可能在所有shell中使用内置函数来实现这一点,但它的可移植性会降低.我没有检查POSIX sh规格,看看它是否具有这样的功能.

  • 它没有比printf更多的POSIX.这甚至在"sh"中起作用. (5认同)
  • printf不是aribtrary精度.`bc`是.例如,以"238862874857408875879219909679752457540"作为输入,printf给出"结果太大".BC方法适用于大于标准int/long/bigint的东西 (4认同)
  • 并且,如果您想要十六进制的大写字母,请使用带有大写X的`printf"%X"`. (3认同)
  • 并强制输出像"0x00",你可以使用printf"0x%02X" (3认同)
  • ... 并且 `bc` 并非随处可用(至少在我的嵌入式 Linux 上不是)。 (2认同)
  • 并且不要忘记在 `printf -v VAR"%x" 34 && echo $VAR` 中的 `-v VAR` (2认同)

Bil*_*win 101

echo "obase=16; 34" | bc
Run Code Online (Sandbox Code Playgroud)

如果要过滤整个整数文件,每行一个:

( echo "obase=16" ; cat file_of_integers ) | bc
Run Code Online (Sandbox Code Playgroud)

  • @skiphoppy:如果你写:echo"obase = 16; 12 34 56"| 你得到1E240,就像你写的那样:echo"obase = 16; 123456"| 公元前.因此,在一行中处理任意数量的整数的方法是将每个数字放在它自己的行上:tr'''\ 015'<input | bc(将空白映射到换行符). (3认同)
  • 如果您碰巧有 'bc',这很好,但 'printf' 是 bash 本身的一部分 (2认同)
  • @Bill Karwin、zsh 或busybox,但也许不是我没试过的一些shell?我不再安装普通的 sh 但显然skiphoppy正在寻找其他选项 (2认同)
  • @Sridhar-Sarnobat,这*是*十进制到十六进制.我假设你的意思是将hex转换为dec.为此,请设置`ibase = 16`.您可以阅读[bc手册](http://www.gnu.org/software/bc/manual/html_mono/bc.html)了解更多详情. (2认同)
  • 您想补充一点, bc 区分大小写。意思是`echo "ibase=16; dead" | bc` 不行,你需要做`echo "ibase=16; DEAD" | bc`,我对此感到有点惊讶 (2认同)

小智 65

十六进制到十进制:

$ echo $((0xfee10000))
4276158464
Run Code Online (Sandbox Code Playgroud)

十进制到十六进制:

$ printf '%x\n' 26
1a
Run Code Online (Sandbox Code Playgroud)


Orw*_*ile 15

bash-4.2$ printf '%x\n' 4294967295
ffffffff

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
Run Code Online (Sandbox Code Playgroud)

  • `-v VAR` 是一个 bash 扩展。[手册页](https://linux.die.net/man/1/printf) 中未提及,只有在不带参数的情况下调用 `printf` 时才会显示 (2认同)
  • @AdrianW 在手册中:https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins (2认同)

Rob*_*lls 5

尝试:

printf "%X\n" ${MY_NUMBER}
Run Code Online (Sandbox Code Playgroud)


小智 5

对不起我的错,试试这个......

#!/bin/bash
:

declare -r HEX_DIGITS="0123456789ABCDEF"

dec_value=$1
hex_value=""

until [ $dec_value == 0 ]; do

    rem_value=$((dec_value % 16))
    dec_value=$((dec_value / 16))

    hex_digit=${HEX_DIGITS:$rem_value:1}

    hex_value="${hex_digit}${hex_value}"

done

echo -e "${hex_value}"
Run Code Online (Sandbox Code Playgroud)

例:

$ ./dtoh 1024
400
Run Code Online (Sandbox Code Playgroud)

  • 谢谢这对环境有很大帮助。其中 `printf` 和 `hex` 命令不可用。 (2认同)
  • @benchuk`printf`在哪里不可用? (2认同)