我正在运行ubuntu 16,并在终端中使用bash脚本读取程序的标准输出。 c ++程序使用putchar通过stdout将8位字符输出到终端。我尝试在bash脚本中捕获该输出并打印ascii十进制表示形式。
例如,如果程序输出“ A”,则bash脚本将转换并打印65作为相应的ascii。但是,当程序输出0-127范围之外的奇怪字符时,我得到的只是32767,而不是正确的小数。看来,ubuntu上的bash无法执行非标准的8位ascii。
我目前正在使用类似的方法将其转换为小数:
decimal=$(printf '%d' "'$char")
有什么方法可以在Linux命令行上将字符从stdout转换为十进制值吗?
答案 0 :(得分:1)
改为尝试xxd -p
。
例如,
char=$'\xff'
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$decimal"
产量:
255
以下是0到255之间字符的测试脚本:
#!/bin/bash
for ((i=0; i<256; i++)); do
hex=$(printf "%x" $i)
char=$(printf "\x${hex}")
if [[ "$i" -eq 10 ]]; then
char=$'\n'
fi
# The if statement above is a workaround to generate the test sequence
# properly because $( ... ) chops of the trailing newline
# and is not essential for the conversion code below
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$i => $decimal"
done
说明:
printf "%c" "$char" | xxd -p
返回十六进制字符串,在这种情况下为ff
。$(( 16#hexval ))
将十六进制值转换为十进制。尽管我建议使用其他语言,例如python
或perl
,以提高灵活性和效率。这是perl版本:
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )