【问题标题】:How to read 8 bit ascii from terminal in linux如何从 linux 终端读取 8 位 ascii
【发布时间】:2018-11-19 03:40:05
【问题描述】:

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

【问题讨论】:

  • 没有“8 位 ASCII”之类的东西——ASCII 是 7 位代码。有各种 8 位字符编码,包括 ASCII 作为代码 0-127(例如 iso8859 和 UTF-8)——也许您是指其中之一?

标签: bash ubuntu ascii


【解决方案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", $_)' )

【讨论】:

  • 这更好,但仍有一些数字变得混乱。 205 更改为 52583 但 243 和 255 可以正常工作...
  • 对不起我的错误。我应该用 0 到 255 的整个字符检查我的代码。我发现了一些与制表符、换行符、空格等的错误翻译,尽管我无法为输入 205 重现输出 52583。我已经更正了我的答案并添加了一个 perl 解决方案以防万一。 BR。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2021-11-30
  • 2021-09-14
  • 2021-03-10
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多