0

ASCII 文字と Unicode 文字が混在するバイナリ データを解析しています。以下に例を示します。

A..|B....|C..

ここで、2 つのドットは Unicode 文字の 2 バイトを表します。

私の質問は..フィールド区切り文字 (|) (0x7c) を使用してこのデータを解析しても安全ですか。または、Unicode バイトの 1 つに 0x7c が表示される可能性はありますか?

お気に入り

A.||B....|C..

ここで、2 番目と 3 番目のバイトは実際には Unicode 文字の一部です。| を使用して解析すると、セパレータとして間違った値を生成します。ありがとう

4

2 に答える 2

1

「Unicode 文字」という表現は、「文字の UTF-16 エンコード」を意味するようです (コメントから判断すると)。答えは、任意の Ascii 制御文字と任意の Ascii 文字がそこに表示される可能性があるということです (より正確には、UTF-16 でエンコードされたデータのバイトの 1 つが、Ascii コードの文字を表すバイトと一致する可能性があります)。当然のことながら、ASCII 文字の UTF-16 エンコーディングは、0 バイトと、ASCII コード値を含むバイトで構成されます。また、たとえば、U+7C7C CJK UNIFIED IDEOGRAPH-7C7C (xiān) の UTF-16 エンコーディングは、2 つの0x7C バイトで構成されます。

垂直線「|」に注意してください。U+007C (ASCII では 0x7C) は、通常の用語では制御文字ではありません。アスキー制御文字は 0x00 ~ 0x1F および 0x7F です。(SPACE 0x20 は、制御文字とグラフィック文字の両方であると説明されることがありますが、これは紛らわしく、最近では一般的に回避されています。)

解析の問題を解決するには、データの形式をより正確に指定する必要があります。アスキー文字の後に UTF-16 エンコーディングで可変量のデータが続くという考えがある場合、明確に解析できないため、フォーマットの設計が不十分なようです。たとえば、「A..|B....|C..」では、ここで「|B」(バイト 0x7C 0x42)として表示されているものが実際には UTF-16 ではないことを(追加のルールなしで)知ることはできません。 U+7C42 または U+427C を表すデータ (UTF-16 のエンディアンに依存)。

于 2013-08-26T05:23:01.603 に答える