C#对UTF-16字节数组执行字符串操作

| 我正在将文件读入“ 0”。该文件包含许多采用以下格式的UTF-16字符串(百万): 第一个字节包含和字符串长度(以字符为单位)(范围0 .. 255) 以下字节包含采用UTF-16编码的字符串字符(每个char用2个字节表示,表示byteCount = charCount * 2)。 我需要对文件中的所有字符串执行标准字符串操作,例如:
IndexOf
EndsWith
StartsWith
,以及with4ѭ和
StringComparison.Ordinal
。 现在,我的代码首先将每个字符串从字节数组转换为
System.String
类型。我发现以下代码是最有效的方法:
// position/length validation removed to minimize the code

string result;
byte charLength = _buffer[_bufferI++];
int byteLength = charLength * 2;

fixed (byte* pBuffer = &_buffer[_bufferI])
{
    result = new string((char*)pBuffer, 0, charLength);
}

_bufferI += byteLength;
return result;
new string(char*, int, int)
仍然很慢,因为它会对每个字符串执行不必要的复制。 Profiler说它的“ѭ9”表现慢。 我需要一种方法来执行字符串操作,而不必为每个字符串复制字节。 有没有一种方法可以直接在字节数组上执行字符串操作? 有没有一种方法可以在不复制字节的情况下创建新字符串?     
已邀请:
        不,您不能在不复制字符数据的情况下创建字符串。 “ѭ10”对象将字符串(Length等)的元数据与字符数据存储在同一存储区中,因此您不能将字符数据保留在字节数组中并假装它是“ 10”宾语。 您可以尝试使用其他方法从字节数据构造字符串,然后查看它们中是否有开销较小的内容,例如
Encoding.UTF16.GetString
。 如果使用指针,则可以尝试一次获取多个字符串,这样就不必为每个字符串固定缓冲区。     
        您可以使用带有Encoding.UTF16的StreamReader来读取文件,因此之间没有\“字节开销\”:
using (StreamReader sr = new StreamReader(filename, Encoding.UTF16)) 
{
    string line;

    while ((line = sr.ReadLine()) != null) 
    {
        //Your Code
    }
}
    
        您可以在字节数组上创建扩展方法,以直接在字节数组上处理大多数这些字符串操作,并避免转换成本。不确定要执行的所有字符串操作是什么,因此不确定是否可以通过这种方式完成所有这些操作。     

要回复问题请先登录注册