c#从流中读取特定类型数组的有效方法

c#从流中读取特定类型数组的有效方法,c#,arrays,C#,Arrays,我正在寻找一种从流中读取多个特定类型数组的有效方法 到目前为止,我正在使用下面这样的类来读取单个值,如:int、byte、sbyte、uint、short、ushort。。。 但也适用于以下数组:ushort[]、short[]、uint[]、int[]、byte[]、sbyte[]、 public byte[]ReadBytes(整数计数) { 字节[]缓冲区=新字节[计数]; int retValue=_Stream.Read(缓冲区,0,计数); 返回缓冲区; } 公共ushort Rea

我正在寻找一种从流中读取多个特定类型数组的有效方法

到目前为止,我正在使用下面这样的类来读取单个值,如:int、byte、sbyte、uint、short、ushort。。。 但也适用于以下数组:ushort[]、short[]、uint[]、int[]、byte[]、sbyte[]、

public byte[]ReadBytes(整数计数)
{
字节[]缓冲区=新字节[计数];
int retValue=_Stream.Read(缓冲区,0,计数);
返回缓冲区;
}
公共ushort ReadUshort()
{
字节[]b=读取字节(2);
if(BitConverter.IsLittleEndian)//用于摩托罗拉(big-endian)
数组。反向(b);
返回位转换器.ToUInt16(b,0);
}
公共ushort[]读取ushort(整数计数)
{
ushort[]数据=新的ushort[count];
for(int i=0;i
与我在这里共享的代码片段相比,有没有更有效的方法来读取数组


我有一种感觉,for循环和每次单个read调用的组合不是很有效。但问题是,我每次都需要检查IsLittleEndian,如果需要,还需要反向检查,以便一次读取多个字节。不确定是否可以更有效地重写

您可以编写一个通用方法,并使用
Buffer.BlockCopy
将数据复制到目标数组中:

    public static T[] ReadElements<T>(Stream input, int count)
    {
        int bytesPerElement = Marshal.SizeOf(typeof(T));
        byte[] buffer = new byte[bytesPerElement * count];

        int remaining = buffer.Length;
        int offset = 0;
        while (remaining > 0)
        {
            int read = input.Read(buffer, offset, remaining);
            if (read == 0) throw new EndOfStreamException();
            offset += read;
            remaining -= read;
        }

        if (BitConverter.IsLittleEndian)
        {
            for (int i = 0; i < buffer.Length; i += bytesPerElement)
            {
                Array.Reverse(buffer, i, bytesPerElement);
            }
        }

        T[] result = new T[count];
        Buffer.BlockCopy(buffer, 0, result, 0, buffer.Length);
        return result;
    }
publicstatict[]ReadElements(流输入,整数计数)
{
int bytesperement=Marshal.SizeOf(typeof(T));
字节[]缓冲区=新字节[bytesPerElement*计数];
剩余整数=缓冲区长度;
整数偏移=0;
而(剩余>0)
{
int read=input.read(缓冲区、偏移量、剩余量);
如果(read==0)抛出新的EndOfStreamException();
偏移量+=读取;
剩余-=读取;
}
if(位转换器.IsLittleEndian)
{
for(int i=0;i
您可以编写一个通用方法,并使用
Buffer.BlockCopy
将数据复制到目标数组中:

    public static T[] ReadElements<T>(Stream input, int count)
    {
        int bytesPerElement = Marshal.SizeOf(typeof(T));
        byte[] buffer = new byte[bytesPerElement * count];

        int remaining = buffer.Length;
        int offset = 0;
        while (remaining > 0)
        {
            int read = input.Read(buffer, offset, remaining);
            if (read == 0) throw new EndOfStreamException();
            offset += read;
            remaining -= read;
        }

        if (BitConverter.IsLittleEndian)
        {
            for (int i = 0; i < buffer.Length; i += bytesPerElement)
            {
                Array.Reverse(buffer, i, bytesPerElement);
            }
        }

        T[] result = new T[count];
        Buffer.BlockCopy(buffer, 0, result, 0, buffer.Length);
        return result;
    }
publicstatict[]ReadElements(流输入,整数计数)
{
int bytesperement=Marshal.SizeOf(typeof(T));
字节[]缓冲区=新字节[bytesPerElement*计数];
剩余整数=缓冲区长度;
整数偏移=0;
而(剩余>0)
{
int read=input.read(缓冲区、偏移量、剩余量);
如果(read==0)抛出新的EndOfStreamException();
偏移量+=读取;
剩余-=读取;
}
if(位转换器.IsLittleEndian)
{
for(int i=0;i
您始终可以进行优化,例如,如果ReadUshort实现了ReadUshort的逻辑,您可以一次读取所有数据。但是你会在维护中失败。它对您的用例至关重要吗?我的代码更难,但速度更快。您可以始终进行优化,例如,如果ReadUshort实现了ReadUshort的逻辑,您可以一次读取所有数据。但是你会在维护中失败。它对您的用例至关重要吗?我的代码更难,但速度更快。这看起来是一个干净的方法,我只是想知道是否有一种方法可以直接读取bigendian/littleendian,而不是为array.reverse提供一个可能的额外for循环?我也在想,但最终还是需要在字节上循环才能交换它们
Array.Reverse
不是最快的解决方案,但它可以通过这种方式处理泛型类型的不同数据大小。这看起来是一种干净的方法,我只是想知道是否有一种方法可以直接读取bigendian/littleendian,而不是为Array提供一个可能的额外for循环。Reverse?我也在想,但最终还是需要在字节上循环才能交换它们
Array.Reverse
不是最快的解决方案,但它可以通过这种方式处理泛型类型的不同数据大小。