bash使用printf将十六进制字符串转换为整数代码失败

时间:2018-12-07 10:15:46

标签: bash

我正在使用for循环遍历字符串中的十六进制数字。我可以提取每个十六进制数字,但是我要转换为数字的代码给出了奇怪的值。我该如何解决此代码?

脚本:

#!/bin/bash

mystring="5e51584a4c"

for (( i = 0; i < ${#mystring}; i = i + 2)); do
    snumber="${mystring:i:2}"
    printf "number as string=%s\n" $snumber
    number=$(printf "%x"  "'${mystring:i:2}")
    printf "number=%d\n" $number
done

我得到以下输出:

number as string=5e
number=35
number as string=51
number=35
number as string=58
number=35
number as string=4a
number=34
number as string=4c
number=34

3 个答案:

答案 0 :(得分:4)

十六进制数字必须带有0x前缀:

printf "%d\n" 0x5e

输出:

94

mystring="5e51584a4c"

for (( i = 0; i < ${#mystring}; i = i + 2)); do
    snumber="${mystring:i:2}"
    printf "number=%d\n" 0x$snumber
done

答案 1 :(得分:4)

在这种情况下,您不需要int main() { int in_count =0; printf("Inorder traversal of the given tree \n"); inorder(root, &in_count); } ,可以使用bash的printf构造。

$((base#number))

答案 2 :(得分:3)

您的printf命令正在打印每个子字符串中第一个数字的字符代码,因为参数的前缀为'。您需要使用0x前缀。

以十六进制打印时,可以使用%#x转换来使printf发出下一个用法所需的前导0x前缀:

number=$(printf '%#x'  "0x${mystring:i:2}")
#                ^^^    ^^