将字节数组转换为不同类型的项的集合

时间:2019-05-23 12:41:00

标签: c#

我将UDP消息作为字节数组接收,并且根据第一个字节中的某些细节,我需要将剩余的字节转换为其他数据类型的多种不同可能排列。

这些数据类型主要是'uint','ushort'和'byte',但可以采用任何顺序,并且可以有任意数量。每个项目都有一个命名变量。

我尝试使用许多不同的选项,并且越来越接近了,但是我觉得我创建的方法并不是最好的。在一些我想使用“ sizeof”但又不想将代码标记为“不安全”的地方。我试图在输入上使用'params'关键字,但这不能与'ref'结合使用。我想使用泛型将它们传递给T1,T2等最大数量,但是意识到我无法枚举它们。现在,我将变量数组与'ref'关键字一起传递,这意味着在内存中创建该数组,但是只有该数组会使用更改后的值而不是原始变量进行更新。

byte[] message = new byte[] { }; //some byte array
ushort item1 = default(ushort);
byte item2 = default(byte);
var argumentArray = new object[] { item1, item2 };
ConvertArray(response, ref argumentArray);
private void ConvertArray(byte[] response, ref object[] items)
{
    int index = 0;
    for (int i = 0; i < items.Length; i++)
    {
        var item = items[i];
        var itemType = item.GetType();
        var itemSize = SizeOf(item.GetType());

        if (itemSize == 0)
        {
            continue;
        }
        else if (itemSize == 1)
        {
            items[i] = response[index];
        }
        else
        {
            var method = typeof(BitConverter).GetMethod($"To{itemType.Name}");
            var returned = method.Invoke(null, new object[] { response, index });
            items[i] = Convert.ChangeType(returned, itemType);
        }

        index = index + itemSize;
     }
}
private int SizeOf(Type type)
{
   switch (type.Name)
   {
       case nameof(UInt16):
           return 2;

       case "Byte":
           return 1;

       default:
           return 0;
   }
}

因此,这部分起作用是因为'argumentArray'正在使用'ConvertArray'方法中的值进行更新,但是我敢肯定有一种使用Types进行此操作的更整洁的方法。

理想情况下,我不需要创建“ argumentArray”,而只需将项目(例如Item1和Item2)直接作为方法的参数传递。

0 个答案:

没有答案