3

変換の問題を解決する方法は 100 通りありますが、私はパフォーマンスに焦点を当てています。

文字列にバイナリ データのみが含まれているとします。C# でそのデータを (char[] ではなく) byte[] に変換する、パフォーマンスの点で最速の方法は何ですか?

明確化: これは ASCII データではなく、たまたま文字列になっているバイナリ データです。

4

4 に答える 4

4

UTF8Encoding.GetBytes

于 2008-09-16T13:31:40.133 に答える
3

ASCIIEncoding.GetBytesがそれを実行するかどうかはわかりません。これは、0x0000から0x007Fの範囲しかサポートしていないためです。

文字列にバイトのみが含まれていることを伝えます。ただし、.NET文字列はcharの配列であり、1文字は2バイトです(.NETは文字列をUTF16として格納するため)。したがって、バイト0x42と0x98を格納するための2つの状況があります。

  1. 文字列はANSI文字列であり、バイトが含まれており、Unicode文字列に変換されるため、バイトは0x00 0x420x000x98になります。(文字列は0x0042および0x0098として保存されます)
  2. 文字列は、文字列にタイプキャストまたは受信したバイト配列であるため、次のバイト0x420x98になりました。(文字列は0x9842として保存されます)

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

だから私はなぜそれがバイトの文字列なのか疑問に思っていますか?

  • 文字列としてエンコードされたバイト(たとえばBase64)が含まれている可能性がありますか?
  • たぶん、char配列またはbyte配列から始める必要がありますか?

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

char配列からbyte配列に移行したい場合、最速の方法はマーシャリングです。しかし、それはあまり良くなく、ダブルメモリを使用します。

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;
}
于 2008-09-16T14:20:52.057 に答える
0

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

/EDIT の説明に応じて: バイナリ データはどのように文字列に取り込まれたのですか? 文字列にバイナリ データを含めることは想定されていません (そのために使用しますbyte[])。

于 2008-09-16T13:54:54.523 に答える
0

文字列からバイナリ データに移行する場合は、最初にバイナリ データを文字列に変換するために使用されたエンコーディングを知っておく必要があります。そうしないと、正しいバイナリ データが得られない可能性があります。したがって、最も効率的な方法は、Encoding サブクラス (UTF8Encoding など) の GetBytes() である可能性がありますが、どのエンコーディングかを確実に知る必要があります。

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

于 2008-09-16T16:16:28.083 に答える