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

问题描述 投票:0回答:3

在 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

十六进制转十进制?十六进制转八进制?十六进制转二进制?

linux printf
3个回答
1
投票

找不到 printf 的方法。 您可以使用 dc 代替。

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

dec 到 bin = 11111111


0
投票

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 个字节)。


0
投票

Perl 在相互转换信息学中使用的所有数字格式方面做得非常好。 我写了一个我自己用的 shell 脚本 这是它最基本的形式:

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

它根据两个参数塑造一个字符串,然后由 Perl 解释器执行。

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

例如

  • o -> 八进制
  • x -> 十六进制
  • b -> 二进制
  • d -> 十进制(u -> 无符号十进制)

第二个参数是要转换的数字

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

  • 0o77

  • 0x3f

  • 0b111111

  • 63 (小数除外)

    convertnumber 0 63
    
    convertnumber x 0o77
    
    convertnumber b 0x3f
    
    convertnumber d 0b111111
    

负数也可以

如果您想查看,请尝试以下操作

负数的十六进制和八进制表示

convertnumber x -1

convertnumber o -1
© www.soinside.com 2019 - 2024. All rights reserved.