2012-02-20 34 views
1

私は入力としてバイト配列を持っています。これは、標準準拠のUTF8 HTMLのバイナリ表現でなければなりません。それはそうですが、大部分の時間だけです。場合によっては、埋め込みヌル(\x0文字またはNUL)も含まれます。これは私のコントロール下ではありません。このバイト配列を文字列に変換する必要があります。ゼロを含むバイトバッファを文字列に変換する方法

はこれまでにしようとしました:

明らか
  • を、それが最初NUL
  • Encoding.UTF8.GetStringを打つ上で停止するようStreamReaderまたはTextReaderを使用することはできません。どちらか動作しません - も最初NUL
に停止します

うまくいったものの、やや不愉快なもの:

mynewarray = myoldarray.Where(x => x!=0).ToArray(); 
    var output = Encoding.UTF8.GetString(mynewarray); 

NULの文字をスキップして新しいバイト配列を作成する場合を除いてこれを行うもっとエレガントな方法がありますか?バイト配列は2〜4Mbよりもかなり大きくなる可能性があります... MSDNではStringsに実際に埋め込まれたNULが含まれているかもしれないと伝えていますが、そのような文字列を処理するにはどのような方法が最適かはわかりません。 (ない

+0

実は、 'UTF8.GetString(バイト[])は'ゼロで停止してはいけません。..しかしその後、 ''\ 0''を含む文字列があります –

+0

バッファサイズよりはるかに小さい私のアサーションのlengthプロパティに頼っていました。私は二重チェックする必要があります。 – jdehaan

+2

拡張文字があれば、文字列の長さはバッファサイズより小さくなります。 – BlueM

答えて

1

あなたの文字列はすでに正しいです。それにはNUL文字が含まれます。しかし、付属の文字であるNULの文字列を使用すると、さまざまな問題が発生します。

Encoding.UTF8.GetString私の例のように\ 0で停止しません。

私は、出力などの文字列ときに何が起こるかを参照してください:

var text = new byte[]{65, 65, 0, 65}; 
    var s = Encoding.UTF8.GetString(text); 
    Console.WriteLine("len is: " + s.Length + " chars"); 
    Console.WriteLine("text: '" + s + "'");  
    Console.WriteLine("this line doesn't appear because NUL was sent to console"); 

出力は次のとおりです。

len is: 4 chars 
text: 'AA 
+0

あなたは完全に正しいです、コードは実際に既に働いていた...私は '\ r \ n '変換のために長さが不一致であることを見落とし、1桁を逃しました。実際の長さは元の配列よりも大きかった。私は今、馬鹿になった。次に、 'Replace'メソッドを使用して、変換された文字列の' NUL'文字を削除することができました。これはコードをより安全にします。何らかのエンコーディングでは、0バイトが有効だったかもしれないからです。今では、ソース配列の0バイトを捨てることを避けることができます。 – jdehaan

0

var output = Encodeing.UTF8.GetString(mynewarray, 0, mynewarray.Length); 
+0

マルチバイトコードの中に '\ 0'はありません。 –

0

あなたのコードは、私には正常に見えるデコードする開始インデックスとバイト数を取るのGetStringのオーバーロードを使用しますが、手動でバッファサイズを制御することによって、それを最適化することができるかもしれません何がWhere()か)、安全でないコードを使用して

ポインタの計算は、配列を使った高速な反復処理に最適で、メモリポインタをどのくらい進めたいのかを完全に制御できます(したがって、安全ではありません)。これは任意の文字を自由に消費/スキップできることを意味します。私はこの目的のために最適化されたバッファ+安全でないコードをC#で定期的に使用します。

.NETフレームワークでは、必要に応じてバッファリングと安全でないコードを使用しますが、正確な要件を知っているため、パフォーマンスを調整することができます。しかし、より冗長なコードになります。

関連する問題