在 android shell 中对十六进制值使用 "printf"

Using "printf" for hex values in android shell

我正在将我的 shell 脚本(相当大的 shell 脚本)从 bash 移植到 android shell (mksh shell) .

在 Android 中,printf 的工作方式似乎与在其他 Linux 系统中的工作方式不同。

示例代码:

$ cat sample.sh 
...
func1()
{
    A=100
    HEXA=`printf "%04x" ${A}`
    echo "A - ${A} HEXA - ${HEXA}"
}

func1

这个函数的输出如下。

$ ./sample.sh
A - 100 HEXA - 300000078

它正在打印一个非常奇怪的数字。

我从其他帖子和 mksh 的联机帮助页中看到,不建议在 mksh 中使用 printf。我的 shell 脚本非常大,正在大量使用它。所以,我想以某种方式处理这个问题。我有什么选择来处理这个问题?

Android 中的 printf 链接到 toybox

root:/ # which printf
/system/bin/printf
root:/ # ls -l /system/bin/printf
lrwxr-xr-x root     shell             2016-11-14 21:02 printf -> toybox

原来问题出在 toybox printf 上。

问题现已解决 - https://github.com/landley/toybox/issues/54

toybox 中修复 printf 很棒。

但是万一有人想打印出一个转换为 hex 的数字(或者几乎任何其他合理的 base 来自 236 如果他们愿意的话)在 无根的 设备上使用旧的 toybox(或者根本没有 toybox)-这是一种使用 mksh:

内置的 typeset 的方法
baseconv(){ typeset -Ui${3:-16} -Z35 x=; echo ${x: -${2:-8}};}

func1()
{
    A=100
    HEXA=$(baseconv $A 4 16)
    echo "A - ${A} HEXA - ${HEXA}"
}

或者只为 printf "%04x" 案例创建一个特定函数:

printf04x(){ typeset -Ui16 -Z7 x=; echo ${x: -4};}

func1()
{
    A=100
    echo "A - ${A} HEXA - $(printf04x $A)"
}