Linux printf将十进制转换为二进制?

jqjz2hbq  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(149)

在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还可以做什么(数字转换)?
十六进制到十进制?十六进制到八进制?十六进制到二进制?

7gs2gvoe

7gs2gvoe1#

无法使用printf。可以使用dc。

nb=255 ; dc -e '[dec to bin = ] 10 i 2 o '"$nb"' r n p'

字符串
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

5sxhfpxr

5sxhfpxr2#

可以在Linux中使用printf函数将Dec转换为Bin吗?
不,C printf没有用于二进制格式化的格式修饰符(http://www.cplusplus.com/reference/cstdio/printf/),而Linux实用程序printf也没有用它来扩展它(%b“expand backslash escape sequences in the corresponding argument”)。printf工具可能仍然会被您的特定shell所掩盖,这可能最终会添加更多的格式化程序,然后你必须检查你的shell的手册(例如bash does extend it somewhat,但仍然没有“二进制”格式化程序)。
用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”将产生该内部(二进制)整数值(“0x 10”)的十六进制格式。
如果你想要“二进制”输出来检查值,经验丰富的汇编程序员不会为此烦恼,他们学会了读取每一个单独的位的十六进制,因为在十六进制中,每个数字都是由4位组成的(0000 = 0x0,0001 = 0x1,.,1110 = 0xE,1111 = 0xF),因此,通过使用十六进制格式,您可以很容易地读取您感兴趣的任何特定位。而真正的二进制输出则通过显示直接使用0/1,但是对于32和64位值,它有点太长了,并且很难保持位置意识,这部分在十六进制中稍微简单一些(因为每两位数是8位=一个字节)。

ogq8wdun

ogq8wdun3#

Perl可以很好地将信息学中使用的所有数字格式相互转换。我自己编写了一个shell脚本,这是它最基本的形式:

convertnumber () {
    [ ${1} = 'd' -o ${1} = 'u' ] || local PREFIX="0${1}"
    perl -e "printf \"${PREFIX}%${1}\\n\", ${2}"
}

字符串
它基于两个参数来形成一个字符串,然后由Perl解释器执行。

第一个参数为目标数字格式,

例如

  • o -> octal
  • x ->十六进制
  • B ->二进制
  • d -> decimal(u -> unsigned decimal)
    第二个参数是要转换的数字

你必须用它的前缀来写,例如。

*0o77
*0x3f
*0b111111
*63(十进制数除外)

convertnumber 0 63

convertnumber x 0o77

convertnumber b 0x3f

convertnumber d 0b111111

负数也有效

如果您想查看

  • 负数的十六进制和八进制表示 *
convertnumber x -1

convertnumber o -1

相关问题