Base16 和交换 bash 中的字节顺序
Base16 and swap endianness in bash
我需要在 bash 中执行操作。我有这个
401f
我喜欢在 bash 中执行这些操作:
- 交换字节顺序
- 来自 base16
这样:
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}"))
我需要在 bash 中执行操作。我有这个
401f
我喜欢在 bash 中执行这些操作:
- 交换字节顺序
- 来自 base16
这样: 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}"))