【问题标题】:Ascii value of Alphanumeric String字母数字字符串的 Ascii 值
【发布时间】:2018-06-09 22:17:46
【问题描述】:

您好,是否可以在不一次读取单个字符的情况下获得字母数字字符串的 ascii 值。 例如,如果我输入 A ,输出应该是 65。 如果我输入 Onkar123#。如何计算这个字符串的ascii? 我还想要上述字符串产生的 ascii 值的总和。

【问题讨论】:

  • If I enter Onkar123# - 预期的输出是什么,为什么?你为什么关心一个工具是否一次读取一个字符?你试过什么了?见How to Ask
  • 我在函数 ASCII() { num_val=echo "$1"|od -N 1 -i|head -1|tr -s " "|cut -d " " -f 2 echo "$num_val" } 下面做了一次返回 1 个字符的 ascii 值。我必须计算一个单词的所有 ascii 值的总和。像这里我必须做onkar123#的ascii总和#
  • 不要将问题中缺少的信息放在问题下方的 cmets 中,而是 edit 您的问题包含所有相关信息。另外,不要只说“我必须做...”,实际上要显示您必须做的任何事情的结果 that 是缺少的预期输出。还要说明为什么一次读取输入 1 个字符的工具是不可接受的,因为我无法想象你为什么会关心它(甚至你如何测试给定的工具是否这样做)。

标签: shell unix awk sed


【解决方案1】:

尝试使用echo "test" | hexdump -e '16/1 "%02x " "\n"',将test 替换为Onkar123# 或其他任何东西

【讨论】:

    【解决方案2】:

    idk 您期望什么样的输出,我也不知道您为什么关心字符串是否一次处理一个字符,或者您如何知道给定工具是否一次处理一个字符(以及如何任何工具都在这样做吗?)所以如果这是否是您正在寻找的答案,但也许这至少会为您指明一个方向:

    $ printf '%s' "Onkar123#" | awk -l ordchr -v RS='.{1}' '{print ord(RT)}'
    79
    110
    107
    97
    114
    49
    50
    51
    35
    

    以上使用 GNU awk 表示 ordchr 库中的 ord()

    根据您的一个 cmets,听起来这可能是您正在寻找的:

    $ printf '%s' "Onkar123#" | awk -l ordchr -v RS='.{1}' '{s+=ord(RT)} END{print s+0}'
    692
    

    【讨论】:

    • 实际上我做了一个函数,它一次计算一个字符的ascii。但我也在为我的算法使用字符的 ascii 总和。所以我两次调用相同的函数。
    • 我根据您在另一个答案下所做的其他 cmet 之一更新了我的答案,但只需编辑您的问题以包含所有相关信息。
    【解决方案3】:

    真的没有字符串的 ASCII 值这样的东西。但是,这样的东西,例如每个 ASCII 字符 in 的十进制(或八进制或十六进制)值。

    由于您似乎没有 hexdump,请尝试使用 od(八进制转储)实用程序。我认为我从未见过没有od 的*nix 系统。

    $ echo "Onkar123#" | od -An -t d1 
    79  110  107   97  114   49   50   51   35   10
    

    我猜字节序可能会起作用。但是od 有一个--endian 参数。

    awk

    在 awk 中要困难得多。我认为您必须建立一个查找表,然后查找输入中每个字符的十进制代码。这意味着您仍然必须一次处理一个字符。

    # output-decimal-ascii.awk -- write ASCII decimal codes for input
    BEGIN {
        # 127 for ASCII; 256 for extended ASCII
        for(n = 0; n < 127; n++) {
            ascii_table[sprintf("%c",n)] = n
        }
    }
    {
        split($0, arr, "")
        for (i = 1; i <= length(arr); i++) {
            printf("%d ", ascii_table[arr[i]])
        }
        print "\n"
    }
    $ echo "Onkar123#" | awk -f code/awk/output-decimal-ascii.awk
    79 110 107 97 114 49 50 51 35 
    

    【讨论】:

    • 使用空字符串 (split($0, arr, "")) 进行拆分是每个 POSIX 未定义的行为,因此这取决于您使用的 awk 版本。它可以在 GNU awk 中工作,但 gawk 也有一个 ord() 函数,所以你可以写awk -l ordchr -v FS="" '{for (i=1;i&lt;=NF;i++) printf "%d%s", ord($i), (i&lt;NF?OFS:ORS)}'
    • 感谢@EdMorton 的工作。有没有办法得到这些值的总和?就像我想要 79 110 107 97 114 49 50 51 35 10 的总和一样。我的意思是所有字符的 ascii 总和。这里的输出应该是 696
    • 当然,它只是一个软件,所以你可以用它做任何事情。编辑您的问题以包含所有相关信息。我不知道为什么您认为值列表的末尾应该有一个10,也不知道为什么您认为总和应该是696,有或没有10
    【解决方案4】:

    总结数字使用:

    echo "test" | od -An -t d1 | xargs | sed "s/ /+/g" | bc
    

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 2021-04-15
      • 2015-12-15
      • 1970-01-01
      • 2014-05-08
      • 2021-12-28
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多