3

私はbyte[]を持っているという非常に奇妙な問題に直面しており、これをConvert.UTF8.GetString(byte [] bytes)メソッドに渡すと、システムエンコーディングが私のバイトを混乱させ、いくつかの特別なバイトのみを置き換えます(私のシステムでマーカーとして使用しています)いくつかの3文字の文字列表現に。

[0] 70  byte
[1] 49  byte
[2] 45  byte
[3] 86  byte
[4] 49  byte
[5] 253 byte     <-- Special byte
[6] 70  byte
[7] 49  byte
[8] 45  byte
[9] 86  byte
[10]50  byte
[11]253 byte     <-- Special byte
[12]70  byte
[13]49  byte
[14]45  byte
[15]86  byte
[16]51  byte

上記のbyte[]をEncoding.UTF8.GetString(bytes)メソッドに渡すと、次の出力が得られます。

private Encoding _encoding = System.Text.Encoding.GetEncoding("UTF-8", new EncoderReplacementFallback("?"), new DecoderReplacementFallback("?"));       
_encoding.GetString(bytes)  "F1-V1�F1-V2�F1-V3" string

実際の値には「�」を付けないでください。これは、これらの特別なバイトをエンコードして「�」に置き換えることができなかったことを意味します。とにかく私はこれを回避することができますか、つまり文字列に変換し、特別なバイト表現を単一の文字に保持することができますか?

マーカーとして使用しようとしている次の特別なバイトがあります。

byte AM = (byte) 254
byte VM = (byte) 253
byte SM = (byte) 252 

あなたの助けとコメントをいただければ幸いです。

ありがとう、

-

シーラズ

4

2 に答える 2

7

これらの特殊な値を UTF-8 文字列内のマーカーとして使用することはできません。これは、文字列が UTF-8エンコーディング規則に従って無効になるためです。

データが のような UTF-8 対応コードに供給される前に、それらをこっそり挿入してから元に戻すこともできますが、それはまさにこっそりなので、良い考えではありません (ブードゥーが起こっていることをまだ知らない人にとっては混乱を招く方法です)。そこにあり、したがって非常に逆効果です)。Encoding.GetString

より健全なオプションは、文字列内に「特別な」UTF-8 エンコード文字を単純に挿入することです。これには技術的に必要です(特に、実際のペイロード内でも発生する可能性が高いため、1バイトにエンコードする文字を選択する場合)、ペイロード内で自然に発生するときにこれらの文字をエスケープするスキームも考え出す必要があります。 .

于 2012-04-23T10:11:39.747 に答える
2

データはマーカー間のUTF-8 のみであるため、私であれば、最初に区切り部分を抽出し、次に各部分を個別に UTF-8 でデコードします。つまり、バイナリデータbyte[]内のマーカーを探して読み進めて、 3 つのバイナリ チャンク (70,49,45,86,49; 70,49,45,86,50; 70,59,45,86,51) は、3 つの文字列にデコードされます。有効な UTF-8 ではないため、バイナリ シーケンス全体を UTF-8 でデコードすることはできません。

ただし、個人的には、ここで区切り文字を使用するのは危険だと思います。私はおそらく長さプレフィックスのアプローチを採用するでしょう。

  • デリミタと実際のデータを誤って混同していないことを知っています
  • バイト単位よりも効率的に処理できる

たとえば、「varint」の長さのプレフィックスを使用した場合、次のようになります。

05,70,49,45,86,49,05,70,49,45,86,50,05,70,59,45,86,51

ここで、05は 5 バイトとして解釈される「varint」の長さです。これは、うまく処理できることを意味します。

// pseude code
while(!EOF) {
    int len = ReadVarint();
    var blob = ReadBytes(len);
    string s = Utf8Decode(blob);
    // ...
}
于 2012-04-23T10:29:57.530 に答える