2

RS232経由で受信したASCII文字の値を取得して、それらをバイナリのような値に変換しようとしています。

例:

0xFF-->########
0x01-->       #
0x02-->      #
...

私の問題は、127 より大きい ASCII 文字の値を取得することです。

int 値を取得するためのテスト コード:
echo -e "\xFF" | gawk -l ordchr -e '{printf("%c : %i", ord($0),ord($0))}'
戻り値:
� : -1

テストコード 2:
echo -e "\x61" | gawk -l ordchr -e '{printf("%c : %i", ord($0),ord($0))}'
リターン:
a : 97

したがって、値を unsigned int に変換する私のソリューションは次のようになります。

if(ord($0)<0)
{
    new_char=ord($0)+256;
}
else new_char = ord($0)+0`

しかし、gawkでintasを直接キャストする方法があるかどうか知りたかったのです。uint

ord()後で私は自分の関数を書こうとしました。

#!/bin/bash

echo -e "\xFF" | awk 'BEGIN {_ord_init()}
{
    printf("%s : %d\n", $0, ord($0))
}

function _ord_init(    i, t)
{
    for (i=0; i <= 255; i++) {
         t = sprintf("%c", i)
        _ord_[t] = i
    }
}

function ord(str,    c)
{
    # only first character is of interest
    c = substr(str, 1, 1)
    return _ord_[c]
}'

0xFF戻り値:

� : 0

0x61戻り値:

a : 97

誰かが私にその行動を説明できますか?

私は使用しています:
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4-p1, GNU MP 6.1.1)

4

3 に答える 3

0

私も同じ問題に遭遇しました。最初に、gawk をユニコード モードまたはバイト モードで実行しているかどうかを検出することになりました (1 つの UTF8 コード ポイントを構成する 3 つの 8 進値の組み合わせの length() をチェックすると、1 または 3 が返されます)。

次に、gawk Unicode モードを検出したら、gawk からカスタム シェル コマンドを実行し、UNIX の printf を使用して 128 ~ 255 バイトを出力し、それを gawk にチャンクして配列に戻します。必要な場合は、コードを貼り付けることができます (ただし、非常に恐ろしいので、エレガンスの欠如に悩まされないことを願っています)。

UTF8には存在しないC0、C1、FFなどのバイトがあるだけなので、どのような組み合わせを試みても、gawk内ですべて256を生成することはできません。それを行う別の方法は、そのチェーンを事前に作成し、何か xxd -ps を使用してハッシュ文字列として保存し、実行時にのみ変換することですが、明らかに遅いです.

于 2021-02-12T00:52:46.030 に答える