bash - 在shell脚本中将十进制数转换为十六进制和二进制

标签 bash shell awk binary hex

我在 file.txt 的每一行中都有一个十进制数:

    1
    2
    3

我正在尝试(现在太久了)编写一个单行脚本来获得一个输出,其中每一行都有一个包含十进制、十六进制和二进制的列。为了简化任务,我们可以说原始数字以字节表示。所以最大值为 255。

  1. 我首先尝试将每个数字解码为带有前缀 0 的二进制,以便获得 8 位模式:

    awk '{print "ibase=10;obase=2;"$1}' $1 |公元前 | xargs printf "%08d\n"

    其中 awk 语句中的外部 $1 是 file.txt。输出是:

    00000001
    00000010
    00000011
    
  2. 16 进制也一样,前面加一个 0

    awk '{printf("0x%02x\n", $1)}' $1

    和以前一样。输出是:

    0x01
    0x02
    0x03
    
  3. 好吧,小数点应该只是一个打印:

    1
    2
    3
    

我想要的是我拥有的一个类轮:

    1 00000001 0x01
    2 00000001 0x02

所以基本上是将 1. 2. 和 3. 放在输出的每一行中。

我尝试使用 system() 在 awk 中执行 bc(和其他命令)但没有成功。还有无数其他方式。你会怎么做?

最佳答案

下面的一行代码应该可以工作:

printf "%s %08d 0x%02x\n" "$1" $(bc <<< "ibase=10;obase=2;$1") "$1"

示例输出:

$ for i in {1..10}; do printf "%s %08d 0x%02x\n" "$i" $(bc <<< "ibase=10;obase=2;$i") "$i"; done
1 00000001 0x01
2 00000010 0x02
3 00000011 0x03
4 00000100 0x04
5 00000101 0x05
6 00000110 0x06
7 00000111 0x07
8 00001000 0x08
9 00001001 0x09
10 00001010 0x0a

关于bash - 在shell脚本中将十进制数转换为十六进制和二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18870209/

相关文章:

linux - 数组值的总数

Linux top -b 只显示特定列

regex - 从文本文件中删除 ^M 个字符的 Shell 命令

regex - 使用awk提取括号中的部分字符串

ubuntu - 只有一个字符的差异

linux - 即使某些进程完成,也要不断填充并行进程的四个槽

linux - Bash "source"命令返回错误的连接字符串

bash - 我的 stderr 去哪儿了?

linux - 为什么 "[ 1 > 2 ]"的计算结果为 True?

shell - 在启动期间在 ubuntu mate 中运行 "source ./file.sh"