bash - 如何在不转换为字符串的情况下使用大的十六进制值?

标签 bash hex byte hexdump

在 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/

相关文章:

java - 如何使用 ObjectOutputStream 和 ObjectInputStream 正确(反)序列化为字节数组?

bash - 如何将多个命令的输出发送到单个 shell 管道?

python - python\xhhK 中奇怪的十六进制表示

c++ - 用 0x 作为十六进制值的前缀

emacs - 如何去掉 CR (^M) 并保留 LF (^J) 字符?

Golang 按位运算以及一般字节操作

c++ - 如何在C++中设置一个字符?

linux - 对于以点开头的不存在的命令,Bash 不会打印任何错误消息

bash - 根据单独文件中列出的值从文本文件中删除观察结果

bash - $BASH_SOURCE 的奇怪行为