如何使用大十六进制值而不转换为字符串?

时间:2015-08-03 20:07:44

标签: bash hex byte hexdump

在bash中我使用SNMP打印机获取一些信息,snmp响应如下:

080118000001FFFB000000020000FFFFFFFD0007FFFEFFFAFFFE0011FFFEFFD507FB000FFF8E001C0006FFF9FFF2FFFE000100040005000600030002000100000007FFFDFFFEFFFE00020008FFFFFFFF0000000100000000FFFC0004FFFDFFFE00010002

根据开发文档,它指出了标头中的前四个字节长的元素 18的第6个字节可以在HEX模式下解释,这非常简单。例如,在第6个字节中为18 HEX的登录用户数为十进制24。其余数据以包含实数和虚数的两个字节增量定义 值应该根据2的补码在整个两个字节或4个半字节中进行解释。

当将这些转换为基于10的数字时,我是否必须将其转换为字符串并执行子字符串函数,或者bash中是否有一个函数允许我根据字节值进行转换。意思是我只想转换第17个字节?

2 个答案:

答案 0 :(得分:2)

bash中,您可以将值的任何子字符串视为十六进制数,并使用

输出其十进制表示
$ value=080118000001FFFB000000020000FFFFFFFD0007FFFEFFFAFFFE0011FFFEFFD507FB000FFF8E001C0006FFF9FFF2FFFE000100040005000600030002000100000007FFFDFFFEFFFE00020008FFFFFFFF0000000100000000FFFC0004FFFDFFFE00010002

$ echo $(( 16#${value:4:2} ))
24

只需在16#前面添加所需的子字符串(此处为从字符串开头的偏移量4开始的两个字节),并在算术表达式($(( ... )))内对其进行评估。

答案 1 :(得分:1)

使用bash

$ s='0801180000...'
$ b=0x${s:4:2}
$ echo $((b))
24

要从字符串18中选择子字符串s,我们使用bash的子字符串扩展:${s:4:2}。然后将其与算术扩展$((...))结合使用,将十六进制数转换为十进制数。

使用awk

$ echo '0801180000...' | awk '{print strtonum("0x" substr($1,5,2));}'
24

如何运作

  • substr($1,5,2)

    这将从第5个字符开始返回一个2个字符的子字符串。对于您的输入,这将返回18

    因为awk使用的是索引原点1而不是0,所以子串18从awk中的1位开始。

  • "0x" substr($1,5,2)

    按照惯例,十六进制字符串以0x开头,因此将字符串0x添加到我们要求生成字符串的子字符串0x18

  • strtonum("0x" substr($1,5,2))

    这会将字符串0x18从十六进制转换为十进制。