在 Linux 中使用
printf
函数,分别使用 %x
和 %o
格式说明符,可以非常轻松地将十进制数转换为十六进制或十进制。
user@linux:~$ file /usr/bin/printf
/usr/bin/printf: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0
user@linux:~$
user@linux:~$ printf "Dec to Hex = %x\n" 255
Dec to Hex = ff
user@linux:~$
user@linux:~$ printf "Dec to Oct = %o\n" 255
Dec to Oct = 377
user@linux:~$
我试图将类似的十进制数转换为二进制,但它不起作用
user@linux:~$ printf "Dec to Bin = %b\n" 255
Dec to Bin = 255
user@linux:~$
Linux 中是否可以使用
printf
函数将 Dec 转换为 Bin?
Linux 还能做什么(数字转换)
printf
?
十六进制转十进制?十六进制转八进制?十六进制转二进制?
找不到 printf 的方法。 您可以使用 dc 代替。
nb=255 ; dc -e '[dec to bin = ] 10 i 2 o '"$nb"' r n p'
dec 到 bin = 11111111
Linux中是否可以使用printf函数将Dec转换为Bin?
不,C
printf
没有用于二进制格式化的格式修饰符(
http://www.cplusplus.com/reference/cstdio/printf/ ),并且 linux util printf
也不用它扩展它(%b
是 ”在相应的扩展反斜杠转义序列论证”)。 printf
工具可能仍然被您的特定 shell 所掩盖,这最终可能会添加更多格式化程序,然后您必须检查 shell 手册(例如 bash 确实在某种程度上扩展了它,但仍然没有“二进制”格式化程序)。
Linux printf 还能做什么(数字转换)?
十六进制转十进制?十六进制转八进制?十六进制转二进制?
它应该支持常见的C格式输入(即
0xN
表示十六进制输入,0N
表示八进制输入),例如:
$ printf "%d %d %#x %#o\n" 0x10 010 16 8
16 8 0x10 010
所以,是的,您基本上可以通过使用所需的输入格式和输出格式将十进制/十六进制/八进制转换为十进制/十六进制/八进制,任意组合。
实际上您的想法是错误的,它是单独的输入到二进制转换,以及二进制到输出,即当您将“16”作为 printf 的参数值时,它会作为字符串传递给工具,然后它将解析该字符串通过值解析器,检测到“16”是十进制格式,将其转换为原生整数值16(即CPU内部的二进制),然后根据格式字符串中的格式说明符最终将其转换回字符串,即“%#” x”将生成该内部(二进制)整数值(“0x10”)的十六进制格式。
如果您希望自己使用“二进制”输出来检查值,经验丰富的汇编程序员不会为此烦恼,他们会学习读取每个单独位的十六进制,因为在十六进制中,每个数字都由恰好 4 位组成(0000 = 0x0, 0001 = 0x1,...,1110 = 0xE,1111 = 0xF),因此通过使用十六进制格式,您可以很容易地读取您感兴趣的任何特定位。虽然真正的二进制输出通过直接显示 0/1 使其变得更容易一些,但对于 32 和 64 位值来说,它有点太长并且很难保持位置感知,这部分在十六进制中稍微简单一些(因为每两个数字为 8 位 = 1 个字节)。
Perl 在相互转换信息学中使用的所有数字格式方面做得非常好。 我写了一个我自己用的 shell 脚本 这是它最基本的形式:
convertnumber () {
[ ${1} = 'd' -o ${1} = 'u' ] || local PREFIX="0${1}"
perl -e "printf \"${PREFIX}%${1}\\n\", ${2}"
}
它根据两个参数塑造一个字符串,然后由 Perl 解释器执行。
第一个参数是目标数字格式,
例如
第二个参数是要转换的数字
你必须用它的前缀来写,例如
0o77
0x3f
0b111111
63 (小数除外)
convertnumber 0 63
convertnumber x 0o77
convertnumber b 0x3f
convertnumber d 0b111111
负数也可以
如果您想查看,请尝试以下操作
负数的十六进制和八进制表示
convertnumber x -1
convertnumber o -1