在bash中我使用SNMP打印机获取一些信息,snmp响应如下:
080118000001FFFB000000020000FFFFFFFD0007FFFEFFFAFFFE0011FFFEFFD507FB000FFF8E001C0006FFF9FFF2FFFE000100040005000600030002000100000007FFFDFFFEFFFE00020008FFFFFFFF0000000100000000FFFC0004FFFDFFFE00010002
根据开发文档,它指出了标头中的前四个字节长的元素 18的第6个字节可以在HEX模式下解释,这非常简单。例如,在第6个字节中为18 HEX的登录用户数为十进制24。其余数据以包含实数和虚数的两个字节增量定义 值应该根据2的补码在整个两个字节或4个半字节中进行解释。
当将这些转换为基于10的数字时,我是否必须将其转换为字符串并执行子字符串函数,或者bash中是否有一个函数允许我根据字节值进行转换。意思是我只想转换第17个字节?
答案 0 :(得分:2)
在bash
中,您可以将值的任何子字符串视为十六进制数,并使用
$ value=080118000001FFFB000000020000FFFFFFFD0007FFFEFFFAFFFE0011FFFEFFD507FB000FFF8E001C0006FFF9FFF2FFFE000100040005000600030002000100000007FFFDFFFEFFFE00020008FFFFFFFF0000000100000000FFFC0004FFFDFFFE00010002
$ echo $(( 16#${value:4:2} ))
24
只需在16#
前面添加所需的子字符串(此处为从字符串开头的偏移量4开始的两个字节),并在算术表达式($(( ... ))
)内对其进行评估。
答案 1 :(得分:1)
$ s='0801180000...'
$ b=0x${s:4:2}
$ echo $((b))
24
要从字符串18
中选择子字符串s
,我们使用bash的子字符串扩展:${s:4:2}
。然后将其与算术扩展$((...))
结合使用,将十六进制数转换为十进制数。
$ 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
从十六进制转换为十进制。