迭代像它的字节数组的Uint16 []

时间:2014-11-15 23:25:28

标签: c# arrays

说我有这样的数组:

byte[] arr = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}

我可以用Uint16处理的元素以某种方式迭代它吗?我想让我的应用程序像{0x1122, 0x3344, 0x5566, 0x7788}一样对待它。

尝试使用as关键字,但编译器没有让我:

byte[] bytearray = new byte[10];
UInt16[] uint16array = bytearray as UInt16[];

有什么办法吗? (不创建另一个数组或每次迭代将两个字节转换为一个uint16)

4 个答案:

答案 0 :(得分:1)

不,C#没有提供一种安全地重新解释一个对象的方法,就好像它是一些不同类型的对象(你可以用不安全的代码来做,但随后整个程序集结束“不安全”)。

您可以使用BitConverter.ToUInt16(),甚至将byte[]包装在MemoryStream中,并使用BinaryReader.ReadUInt16()方法从byte []对象中读取。但从问题的措辞来看,你不想使用任何类似的方法。

答案 1 :(得分:1)

您可以使用不安全的代码:

fixed(byte* p = bytearray)
{
    ushort* ptr=(ushort*)p;
    for(int i = 0; i < bytearray.Length/2; i++)
    {
        //...
    }
}

答案 2 :(得分:1)

您不能像这样强制转换整个数组,至少在托管代码中不能。您可以使用BitConverter.ToUInt16进行转换,如下所示:

UInt16[] uint16array = Enumerable
    .Range(0, arr.Length/2)
    .Select(i => BitConverter.ToUInt16(arr, 2*i))
    .ToArray();

答案 3 :(得分:1)

这个小助手方法可以帮助你

public static class helper
{
    public static UInt16[] ToUnit16(this byte[] arr)
    {
        if (arr == null)
            return null;

        var len = arr.Length;

        if ((len % 2) != 0)
            throw new ArgumentException("Must divide by 2");

        var count = len / 2;

        var result = new UInt16[count];
        do
        {
            result[--count] = (UInt16)((arr[--len]) | arr[--len] << 8);
        } while (count > 0);

        return result;
    }
}