2008-09-16 8 views
2

変換の問題を解決する100の方法がありますが、私はパフォーマンスに焦点を当てています。 C#を使用して、バイナリデータを含む文字列をバイト配列に変換する最も効率的な方法は何ですか

が文字列のみ、バイト[]へのデータの変換、性能の点で、最速の方法は何であるバイナリデータが含まれていることを与え(CHARない[])C#の下?

明確化:これはASCIIデータではなく、むしろ文字列内に存在するバイナリデータです。

+0

文字列にはバイナリデータのみが含まれていますか?これは何を意味するのでしょうか?それには「1」と「0」文字しかありませんか? –

答えて

3

それだけrange 0x0000 to 0x007Fをサポートしているので、私は、ASCIIEncoding.GetBytesがそれを行うために起こっているか分かりません。

文字列にはバイトのみが含まれています。しかし、.NET文字列はcharの配列であり、1 charは2バイトです(.NETは文字列をUTF16として格納するため)。ですから、バイト0x42にして0×98を格納するための2つの状況を持つことができ、次のいずれか

  1. 文字列は、このようにバイトが0x00の0x42に0x00を0×98になり、ANSI文字列だったとバイトが含まれているとUnicode文字列に変換されます。 (文字列は0x0042と0x0098として格納されています)
  2. 文字列は、文字列に型キャストされたかちょうど受け取られただけのバイト配列でしたので、次のバイト0x42 0x98になりました。 (文字列は0x9842として格納されます)

結果の最初の状況では、0x42と0x3F( "B?"の場合はascii)になります。 2番目の状況は0x3F( "?"の場合はascii)になります。これは論理的です。文字は有効なASCII範囲外にあり、エンコーダはそれらの値をどう処理するかを知らないためです。

だから私はなぜそれがバイトの文字列ですか?

  • 文字列としてエンコードされたバイト(たとえば、Base64)が含まれている可能性がありますか?
  • char配列かバイト配列で始めるべきでしょうか?

実際に状況2があり、その中からバイトを取得したい場合は、UnicodeEncoding.GetBytesコールを使用する必要があります。それは0x42と0x98を返します。

あなたはバイト配列、マーシャリングされるだろう最速の方法にchar型の配列から行きたい..しかし、それは本当に素敵ではない、と二重のメモリを使用している場合。

public Byte[] ConvertToBytes(Char[] source) 
{ 
    Byte[] result = new Byte[source.Length * sizeof(Char)]; 
    IntPtr tempBuffer = Marshal.AllocHGlobal(result.Length); 
    try 
    { 
     Marshal.Copy(source, 0, tempBuffer, source.Length); 
     Marshal.Copy(tempBuffer, result, 0, result.Length); 
    } 
    finally 
    { 
     Marshal.FreeHGlobal(tempBuffer); 
    } 
    return result; 
} 
+0

@Davy Landman:彼は彼の要求にもっと詳しい情報を使うことができると思う。 – user7116

+0

@sixlettervariables:確かに、私は彼の明確化が十分にはっきりしていないことをノアに説明しようとしていた。 –

0

は、C#でのASCII文字列のようなものありません!文字列常ににはUTF-16が含まれています。これを実現しないと、多くの問題が発生します。つまり、文字列はUTF-16でエンコードされているとみなし、文字をASCII記号に変換するため、前述のメソッドは機能します。

/EDIT:このバイナリデータはどのように文字列に入りましたか?文字列はバイナリデータを含んではなりません(そのためにbyte[]を使用してください)。

+0

私は、ユーザが混合テキストとバイナリデータを持つ奇妙なファイル形式を持っていると思います。 –

0

あなたがバイナリデータ、に文字列から行きたい場合は、最初の場所でバイナリデータを文字列に変換するために使用されたものエンコーディングを知っている必要があります。さもなければ、あなたは正しいバイナリデータで終わらないかもしれません。したがって、最も効率的な方法は、Encodingサブクラス(UTF8Encodingなど)のGetBytes()ですが、どのエンコーディングが正しいかを知る必要があります。

元の質問に対するKent Boogaartのコメントはかなりうまくまとめられています。 ;]

関連する問題