在 bash 中,我对打印机进行 SNMP 操作以获取一些信息,snmp 响应如下所示:
080118000001FFFB000000020000FFFFFFFD0007FFFEFFFAFFFE0011FFFFFFD507FB000FFF8E001C0006FFF9FFF2FFFE000100040005000600030002000100000007FFFDFFFEFFFE0002 0008FFFFFFFF0000000100000000FFFC0004FFFDFFFE00010002
根据开发文档,它指出 header 中的前四个字节长元素将是 第 6 个字节(18)可以用十六进制模式解释,这非常简单。例如,第 6 个字节为 18 HEX 的登录用户数,则十进制为 24。其余数据以两个字节增量定义,包含实部和虚部 值,并应根据整个两个字节或 4 个半字节的 2 补码进行解释。
当将这些转换为基于 10 的数字时,我是否必须将其转换为字符串并执行子字符串函数,或者 bash 中是否有函数允许我根据字节值进行转换。意思是我只想转换第 17 个字节?
最佳答案
在 bash
中,您可以将值的任何子字符串视为十六进制数,并使用 输出其十进制表示形式
$ value=080118000001FFFB000000020000FFFFFFFD0007FFFEFFFAFFFE0011FFFEFFD507FB000FFF8E001C0006FFF9FFF2FFFE000100040005000600030002000100000007FFFDFFFEFFFE00020008FFFFFFFF0000000100000000FFFC0004FFFDFFFE00010002
$ echo $(( 16#${value:4:2} ))
24
只需在所需的子字符串(此处为从字符串开头偏移 4 处开始的两个字节)前加上 16#
并在算术表达式 ($(( .. .))
).
关于bash - 如何在不转换为字符串的情况下使用大的十六进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31795875/