在 Bash 中工作时,我有一个十六进制变量,必须将其从小端转换为大端,我对这个概念很陌生,大约 20 分钟前才了解到这一点,所以请与我分享。
我的脚本确定了一个经过一些更改的十六进制变量:十进制、有符号 2 的补码以及除以 8。
在一切之前,它必须经过小端到大端的转换(我可能会混淆两者,但我下面的例子应该澄清)
例子:
十六进制值:0080 转换后:8000
十六进制值:9800 转换后:0098
十六进制值:1234 转换后:3412
我相信这是一个 16 位十六进制变量,因为它始终是 4 位数字。
答案1
要交换 16 位值的字节顺序,需要交换两个字节的位置。这可以被解构为将字节与字隔离,将它们移动到字内的另一个位位置,然后将它们组合回单个字。
要隔离某些位,请使用二进制和, &
.实际上,一个操作数中的位具有x & 0 = 0
和,给出了来自另一操作数的位。因此,eg给出低四位。x & 1 = x
1
0xab & 0x0f = 0x0b
要移动它们,请使用 Shift<<
或>>
。例如0x0f << 4 = 0xf0
。
要组合这些值,请使用二进制或者, |
.例如0x30 | 0x07 = 0x37
。
组合起来,字节交换x
为y
:
l = x & 0x00ff # isolate low byte
h = x & 0xff00 # isolate high byte
y = (l << 8) | (h >> 8) # move and combine
这些操作的运算符在许多编程语言中都是相同的,它们是从 C 继承的。这包括 shell,但是在那里,您必须将表达式放在算术扩展中,因此$(( ... ))
。 (也就是说,如果您无论如何都想在 shell 中执行类似的操作,那么它可能不是执行此类操作的最佳工具。)