Base16 和交换 bash 中的字节顺序

Base16 and swap endianness in bash

我需要在 bash 中执行操作。我有这个

401f

我喜欢在 bash 中执行这些操作:

这样: https://gchq.github.io/CyberChef/#recipe=Swap_endianness('Hex',4,true)From_Base(16)&input=NDAxZg

所以结果应该是8000。而且我喜欢使用尽可能少的依赖项来做到这一点。我的意思是,如果仅使用 linux 核心实用程序就可以做到这一点,那就太好了……我想需要一些东西。 Nnot sure what, maybe xxd, awk and that's ok,但我想避免使用bc和类似的东西。谢谢

使用支持按位运算的算术扩展在 shell 中很容易做到。

num=401f
# Add a 0x prefix so it's treated as base 16 in shell arithmetic.
num="0x$num"
# Swap the bytes in a 16-bit number and print the result in base 10
printf "%d\n" $(( ((num & 0xFF) << 8) | (num >> 8) ))
# Or assign to a variable, etc.
newnum=$(( ((num & 0xFF) << 8) | (num >> 8) ))

用于 16 位和 32 位字节交换的便捷 bash 函数:

bswap16() {
    # Default to 0 if no argument given
    local num="0x${1:-0}"
    printf "%d\n" $(( ((num & 0xFF) << 8) | (num >> 8) ))
}

bswap32() {
    local num="0x${1:-0}"
    printf "%d\n" $(( ((num & 0xFF) << 24) |
                      (((num >>  8) & 0xFF) << 16) |
                      (((num >> 16) & 0xFF) <<  8) |
                        (num >> 24) ))
}

bswap16 401f # 8000
bswap32 401f # 524288000

使用 bash 的参数子字符串扩展的替代方案(与上面不同,此版本要求数字有 4 个十六进制数字才能正常工作):

num=401f
echo $(("0x${num:2:2}${num:0:2}"))