如何从Linux中的终端读取8位ascii

时间:2018-11-19 03:40:05

标签: bash ubuntu ascii

我正在运行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转换为十进制值吗?

1 个答案:

答案 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 ))将十六进制值转换为十进制。

尽管我建议使用其他语言,例如pythonperl,以提高灵活性和效率。这是perl版本:

decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )