我做的在C#中有很多字符串操作,而真正需要的字符串存储每个字符一个字节。 这是因为我需要的文字千兆同时在内存中,它是造成内存不足的问题。 我肯定知道这个文本将不会包含非ASCII字符,所以我的目的,事实上,System.String和System.Char店内的一切,每个字符用两个字节既是不必要的,一个真正的问题。
我即将开始编码自己CharAscii和StringAscii类 - 字符串一个将基本保持其数据的byte [],并揭露类似System.String做的那些字符串操作方法。 然而,这似乎是一个大量的工作做一些事情,似乎是一个非常标准的问题,所以我真的在这里发帖,检查有没有一个简单的解决方案。 是否有例如在一些办法可以让内部System.String存储数据的UTF8我有没有注意到,或者一些其他的方式解决这问题?
正如您看到的,CLR使用UTF-16字符编码。 最好的办法可能是使用的编码类和一个BitConverter来处理文本。 这个问题有两个编码之间转换一些很好的例子:
转换字符串(UTF-16)为UTF-8在C#
嗯,你可以创建检索的数据为UTF-8字节,并根据需要System.String转换件的包装,然后反之亦然推弦回给内存。 Encoding类将帮助你在这里:
var utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(myString);
var myReturnedString = utf8.GetString(utfBytes);
并不是的。 System.String
是专为存储字符串。 您的需求就是具有特定内存优势串的一个非常特别的子集。
现在,“特别内存优势串的非常特定子集”来了很多,但并不总是一样非常特别的子集。 这是ASCII的唯一的代码不是由人阅读,因此它往往是要么短代码,或一些可以在流处理的方式来处理,否则文本块合并与字节做其他工作(例如,相当多的二进制格式将有小位直接转换为ASCII)。
因此,你有一种非常独特的要求。
更何况,当你来到了千兆字节的一部分。 如果我负责的演出,我立即想我怎么能阻止不得不应付演出,和/或获取要严重得多节约不仅仅是50%。 我会想映射块我不是目前的文件感兴趣,或约绳索,或约一堆其他的事情。 当然,这些都是要为某些情况下,并不适合所有工作,所以再次,我们不是在谈论一些地方.NET应该坚持的东西作为一个尺寸适合所有人,因为一个尺寸不适合所有。
除此之外,就在UTF-8位并不难。 这一切都变成工作的其他方法。 同样,你需要什么也不会有一样的别人。
我可以看到你的问题是,焦炭在C#中占据的,而不是一个2个字节。
阅读文本文件的一种方法是打开它:
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();
而这样一来,你是从文件读取的字节数。 我用UTF-8即每字符的2字节的编码* .txt文件,和ANSI即每字符1个字节尝试过。