将变量从小端转换为大端

将变量从小端转换为大端

在 Bash 中工作时,我有一个十六进制变量,必须将其从小端转换为大端,我对这个概念很陌生,大约 20 分钟前才了解到这一点,所以请与我分享。

我的脚本确定了一个经过一些更改的十六进制变量:十进制、有符号 2 的补码以及除以 8。

在一切之前,它必须经过小端到大端的转换(我可能会混淆两者,但我下面的例子应该澄清)

例子:

  1. 十六进制值:0080 转换后:8000

  2. 十六进制值:9800 转换后:0098

  3. 十六进制值:1234 转换后:3412

我相信这是一个 16 位十六进制变量,因为它始终是 4 位数字。

答案1

要交换 16 位值的字节顺序,需要交换两个字节的位置。这可以被解构为将字节与字隔离,将它们移动到字内的另一个位位置,然后将它们组合回单个字。

要隔离某些位,请使用二进制, &.实际上,一个操作数中的位具有x & 0 = 0和,给出了来自另一操作数的位。因此,eg给出低四位。x & 1 = x10xab & 0x0f = 0x0b

要移动它们,请使用 Shift<<>>。例如0x0f << 4 = 0xf0

要组合这些值,请使用二进制或者, |.例如0x30 | 0x07 = 0x37

组合起来,字节交换xy

l = x & 0x00ff             # isolate low byte
h = x & 0xff00             # isolate high byte
y = (l << 8) | (h >> 8)    # move and combine 

这些操作的运算符在许多编程语言中都是相同的,它们是从 C 继承的。这包括 shell,但是在那里,您必须将表达式放在算术扩展中,因此$(( ... ))。 (也就是说,如果您无论如何都想在 shell 中执行类似的操作,那么它可能不是执行此类操作的最佳工具。)

相关内容