37

私は C# で多くの文字列操作を行っていますが、文字列を 1 文字につき 1 バイト格納する必要があります。これは、メモリ内で同時にギガバイトのテキストが必要であり、メモリ不足の問題を引き起こしているためです。このテキストに非 ASCII 文字が含まれることは決してないことは確かなので、System.String と System.Char がすべてを 1 文字あたり 2 バイトとして格納するという事実は、不要であり、実際の問題でもあります。

独自の CharAscii および StringAscii クラスのコーディングを開始しようとしています。文字列は基本的にデータを byte[] として保持し、System.String と同様の文字列操作メソッドを公開します。ただし、これは非常に標準的な問題のように見えることを行うには多くの作業が必要なように思われるため、ここに投稿して、まだ簡単な解決策がないことを確認します。たとえば、System.String に気づいていない UTF8 としてデータを内部的に格納する方法や、問題を回避する方法はありますか?

4

4 に答える 4

11

データを UTF-8 バイトとして取得し、必要に応じて一部を System.String に変換し、その逆を行って文字列をメモリにプッシュするラッパーを作成できます。Encoding クラスは、ここで役立ちます。

var utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(myString);

var myReturnedString = utf8.GetString(utfBytes);
于 2012-08-27T15:09:13.960 に答える
6

ご覧のとおり、CLR は文字エンコードに UTF-16 を使用します。Encoding クラスと BitConverter を使用してテキストを処理することをお勧めします。この質問には、2 つのエンコーディング間の変換の良い例がいくつかあります。

C# で文字列 (UTF-16) を UTF-8 に変換する

于 2012-08-27T15:10:24.300 に答える
3

あまり。System.String文字列を格納するように設計されています。あなたの要件は、特定のメモリ上の利点を持つ文字列の非常に特定のサブセットです。

現在、「特定のメモリ上の利点を持つ文字列の非常に特定のサブセット」が頻繁に出てきますが、常に同じ非常に特定のサブセットとは限りません。ASCII のみのコードは人間が読み取るためのものではないため、短いコードであるか、ストリーム処理方法で処理できるものであるか、他のジョブを実行するバイトとマージされたテキストのチャンクである傾向があります (たとえば、かなりの数のバイナリ形式には、直接 ASCII に変換される小さなビットがあります)。

そのため、かなり奇妙な要件があります。

ギガバイトの部分になるとなおさらです。ギグに対処している場合、どうすればギグに対処する必要がなくなるか、および/またはわずか50%よりもはるかに深刻な節約ができるかをすぐに考えています. 私は、現在興味のないチャンクをファイルにマッピングしたり、ロープについて、または他の多くのことについて考えています。もちろん、それらはすべてではなく、いくつかのケースで機能するため、繰り返しますが、万能型として .NET が何かに固執する必要があるという話ではありません。全て。

それを超えて、utf-8 ビットだけはそれほど難しくありません。仕事になるのは他のすべての方法です。繰り返しますが、そこに必要なものは他の誰かと同じではありません。

于 2012-08-27T15:11:20.040 に答える
0

私が見ることができるように、あなたの問題は、C# の char が 1 バイトではなく 2 バイトを占めていることです。

テキスト ファイルを読み取る 1 つの方法は、次のコマンドで開くことです。

    System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open);
    System.IO.BinaryReader br = new System.IO.BinaryReader(fs);

    byte[] buffer = new byte[1024];
    int read = br.Read(buffer, 0, (int)fs.Length);

    br.Close();
    fs.Close(); 

このようにして、ファイルからバイトを読み取っています。char あたり 2 バイトの UTF-8でエンコードされた *.txt ファイルと、 charあたり 1 バイトのANSIでエンコードされた *.txt ファイルで試しました。

于 2012-08-27T15:37:30.937 に答える