C# 读取字节[]的最快(可能不安全)方式是什么?

C# 读取字节[]的最快(可能不安全)方式是什么?,c#,multithreading,buffer,C#,Multithreading,Buffer,我正在用C#处理一个服务器项目,在接收到TCP消息后,会对其进行解析,并将其存储在精确大小的字节[]中。(不是固定长度的缓冲区,而是存储所有数据的绝对长度的字节[]。) 现在为了阅读这个字节[],我将创建一些包装函数(也是为了兼容性),以下是我需要的所有函数的签名: public byte ReadByte(); public sbyte ReadSByte(); public short ReadShort(); public ushort ReadUShort(); public int R

我正在用C#处理一个服务器项目,在接收到TCP消息后,会对其进行解析,并将其存储在精确大小的字节[]中。(不是固定长度的缓冲区,而是存储所有数据的绝对长度的字节[]。)

现在为了阅读这个字节[],我将创建一些包装函数(也是为了兼容性),以下是我需要的所有函数的签名:

public byte ReadByte();
public sbyte ReadSByte();
public short ReadShort();
public ushort ReadUShort();
public int ReadInt();
public uint ReadUInt();
public float ReadFloat();
public double ReadDouble();
public string ReadChars(int length);
public string ReadString();
该字符串是以\0结尾的字符串,可能是用ASCII或UTF-8编码的,但我不能确定这一点,因为我没有编写客户端

存在以下数据:

byte[] _data;
int _offset;
现在我可以手动编写所有这些函数,如下所示:

public byte ReadByte()
{
    return _data[_offset++];
}

public sbyte ReadSByte()
{
    byte r = _data[_offset++];
    if (r >= 128) return (sbyte)(r - 256);
    else return (sbyte)r;
}

public short ReadShort()
{
    byte b1 = _data[_offset++];
    byte b2 = _data[_offset++];
    if (b1 >= 128) return (short)(b1 * 256 + b2 - 65536);
    else return (short)(b1 * 256 + b2);
}

public short ReadUShort()
{
    byte b1 = _data[_offset++];
    return (short)(b1 * 256 + _data[_offset++]);
}
但是我想知道是否有更快的方法,不排除使用不安全的代码,因为对于简单的处理来说,这似乎花费了太多的时间。

在系统名称空间中查看该类。它包含将部分字节[]转换为其他基元类型的方法。我曾在类似的情况下使用过它,并发现它相当快


对于从字节[]s解码字符串,请使用System.Text命名空间中从该类派生的类,特别是方法(及其重载)。

一种方法是将数组的内容映射到结构(前提是结构确实是静态的):

你可以用一个小盒子

BinaryReader是一个流装饰器,因此您必须将
字节[]
包装在MemoryStream中,或者将读取器直接连接到网络流

然后你有

int ReadInt32()
char[] ReadChars(int count)
等等


编辑:显然你想要“更快的执行”。 这意味着在通过(网络)I/O接收到字节后,您正在寻找从
字节[]
转换的优化


换句话说,您正在尝试优化只占用(估计)0.1%时间的零件。完全没有用

我知道BitConverter类,我会再试一次,但我认为上次我尝试它时出现了问题。如果你想发布另一个关于BitConverter问题的问题,请在这里发布一个问题链接,我会看一看。我再次发现问题,如果byte[]_data={2,1,0,9};,然后BitConverter.ToInt32(_data,0)的结果是:{9,0,1,2}->Int32也用于编码。(编码类型).GetString(),如何将其设置为作为\0终止的字符串读取?因为他们在默认情况下读取长度前缀字符串。所以要更改它,我只需要反转数据,那么读取字符串怎么样?一个有趣的方法-我想知道它是否更快。可能必须对这些进行基准测试。。。谢谢=)这不是我想要的,也不是静态的。我知道,但这肯定不会更快,因为你需要先将数据包装到内存流中,然后再包装到二进制读取器中,二进制读取器在实际解析数据之前将其包装到内存流中。@Aidia,你的问题不清楚你到底想要什么。在最后一句话中,你谈到了工作量,这是另一个更快的问题。一个更明智的选择。我会编辑。
int ReadInt32()
char[] ReadChars(int count)