如何在bash中将字符串读取为十六进制数?

Den*_*vac 7 bash numeric-data hex expr

我有 bash 线:

expr substr $SUPERBLOCK 64 8
Run Code Online (Sandbox Code Playgroud)

这是返回给我的字符串行:

00080000
Run Code Online (Sandbox Code Playgroud)

我知道这实际上是小端的 0x00080000。有没有办法在像 0x80000 这样的 big-endian 中的 bash 中从它创建整数变量?

jes*_*e_b 8

可能是一个更好的方法来做到这一点,但我想出了这个解决方案,将数字转换为十进制,然后再转换回十六进制(并手动添加0x):

printf '0x%x\n' "$((16#00080000))"
Run Code Online (Sandbox Code Playgroud)

你可以写成:

printf '0x%x\n' "$((16#$(expr substr "$SUPERBLOCK" 64 8)))"
Run Code Online (Sandbox Code Playgroud)

  • @DenisNovac 我不确定你是否正确使用大/小端(也许你有其他想法,但我正在做一些汇编编程是为了好玩,所以对我来说字节序是每字节),但 0x12345678 是其他字节序0x78563412,不是 0x87654321。(并且您的问题“00080000”中的值在字节交换“00000800”之后,即十进制2048) (5认同)

Gre*_*ods 5

有两种或多或少的标准(和古老)命令行 unix 工具提供了在不同基数之间转换数字的非常简单的方法:

$ { echo '16'; echo i; echo 00080000; echo p; } | dc
524288
$ { echo 'ibase=16'; echo 00080000; } | bc  
524288
Run Code Online (Sandbox Code Playgroud)

对于正常的人类使用,我非常喜欢bc,但是在编写生成代码的程序时,尤其是从某种解析器中生成代码时,像这样的基于堆栈的工具dc可能更容易处理(实际上原始版本bc是前端的解析器dc)。