Bash linux下如何从终端读取8位ascii码

Bash linux下如何从终端读取8位ascii码,bash,ubuntu,ascii,Bash,Ubuntu,Ascii,我正在运行Ubuntu16,在终端中使用一个bash脚本来读取程序的标准输出。C++程序使用STUDUT将PutChar输出到终端8位字符。我尝试在bash脚本中捕获该输出,并打印ascii十进制表示 例如,如果程序输出“A”,bash脚本将转换并打印65作为相应的ascii。然而,当程序输出一个超出0-127范围的奇怪字符时,我得到的是32767而不是正确的小数。看起来ubuntu上的bash不支持非标准的8位ascii 我目前使用类似这样的方法来转换为十进制: decimal=$(print

我正在运行Ubuntu16,在终端中使用一个bash脚本来读取程序的标准输出。C++程序使用STUDUT将PutChar输出到终端8位字符。我尝试在bash脚本中捕获该输出,并打印ascii十进制表示

例如,如果程序输出“A”,bash脚本将转换并打印65作为相应的ascii。然而,当程序输出一个超出0-127范围的奇怪字符时,我得到的是32767而不是正确的小数。看起来ubuntu上的bash不支持非标准的8位ascii

我目前使用类似这样的方法来转换为十进制:

decimal=$(printf '%d' "'$char")

有没有办法在linux命令行上将字符从标准输出转换为十进制值?

试试
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

没有所谓的“8位ASCII”——ASCII是7位代码。有各种8位字符编码,包括ASCII码0-127(如iso8859和UTF-8)——也许你是说其中一种?这更好,但仍有一些数字弄乱了。205改为52583,但243和255可以正常工作,例如…抱歉我的错误。我应该用0到255的整字符检查代码。我发现了一些与制表符、换行符、空格等的误译,尽管我无法重现输入205的输出52583。我已经更正了我的答案,并添加了一个perl解决方案以防万一。比尔。
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )