C# 如何将int数组值复制到字节数组中?仅复制C中的值

C# 如何将int数组值复制到字节数组中?仅复制C中的值,c#,arrays,integer,bytearray,C#,Arrays,Integer,Bytearray,嗨,我有这种数组 int[] arrayint = new int[32]; 它包含 arrayint[0] = 99 arrayint[1] = 121 arrayint[2] = 99 arrayint[3] = 66 ... 有没有一种简单的方法可以将整数数组复制到字节数组中,就像我想制作这个字节数组一样 byte[] streambit; 它应该与arrayint值相同 我想这样的输出 streambit[0] = 99 streambit[1] = 121 streambit[2

嗨,我有这种数组

int[] arrayint = new int[32];
它包含

arrayint[0] = 99
arrayint[1] = 121
arrayint[2] = 99
arrayint[3] = 66
...
有没有一种简单的方法可以将整数数组复制到字节数组中,就像我想制作这个字节数组一样

byte[] streambit;
它应该与arrayint值相同

我想这样的输出

streambit[0] = 99
streambit[1] = 121
streambit[2] = 99
streambit[3] = 66
...
只需确保没有大于255的值

streambit=arrayint.Where(x=>x>=0&&x<=255).Select(y=>(byte)y).ToArray();

只需确保没有大于255的值。

没有LINQ在以.Net 2.0为目标时非常有用,例如:

streambit=arrayint.Where(x=>x>=0&&x<=255).Select(y=>(byte)y).ToArray();
byte[] bytearray = Array.ConvertAll<int, byte>(arrayint, (z) => (byte)z);
嗯,是的,比LINQ快得多:

测试代码可以改进,但这提供了一个想法:

private static void Main(string[] args)
{
    int[] arrayint = new int[40000];

    arrayint[0] = 99;
    arrayint[1] = 157;
    arrayint[2] = 1;
    arrayint[3] = 45;

    byte[] bytearray;

    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        bytearray = Array.ConvertAll<int, byte>(arrayint, (z) => (byte)z);
    }

    sw.Stop();
    Console.WriteLine("ConvertAll took {0} ms", sw.ElapsedMilliseconds);

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        bytearray = arrayint.Select(z => (byte)z).ToArray();
    }

    sw.Stop();
    Console.WriteLine("LINQ took {0} ms", sw.ElapsedMilliseconds);

    Console.ReadLine();
}
结果:

ConvertAll花了1865毫秒

林克用了6073毫秒


没有LINQ在以.Net 2.0为目标时非常有用,例如:

byte[] bytearray = Array.ConvertAll<int, byte>(arrayint, (z) => (byte)z);
嗯,是的,比LINQ快得多:

测试代码可以改进,但这提供了一个想法:

private static void Main(string[] args)
{
    int[] arrayint = new int[40000];

    arrayint[0] = 99;
    arrayint[1] = 157;
    arrayint[2] = 1;
    arrayint[3] = 45;

    byte[] bytearray;

    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        bytearray = Array.ConvertAll<int, byte>(arrayint, (z) => (byte)z);
    }

    sw.Stop();
    Console.WriteLine("ConvertAll took {0} ms", sw.ElapsedMilliseconds);

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        bytearray = arrayint.Select(z => (byte)z).ToArray();
    }

    sw.Stop();
    Console.WriteLine("LINQ took {0} ms", sw.ElapsedMilliseconds);

    Console.ReadLine();
}
结果:

ConvertAll花了1865毫秒

林克用了6073毫秒


您可能想补充一点,在这种情况下,不应该有任何负值,并且相应的字节也不会“相同”……这里需要注意的一件有趣的事情是,任何大于255或小于0的整数都将以包装方式进行转换,而不会引发溢出异常。例如:-1将转换为255,256将转换为0。就是这样,非常感谢。。。你能给我解释一下密码吗?我对i=>bytei.ToArray的含义有点困惑,它是如何生成字节的?i=>bytei被称为lambda表达式,是匿名函数的一种特殊符号。在本例中,它是一个接受参数的函数,将其转换为int,然后返回它。Select方法获取集合的每个元素,然后对它们调用lambda。ToArray方法将结果复制到数组中。您可能想补充一点,在这种情况下,不应存在负值,并且相应的字节将不“相同”……这里需要注意的一件有趣的事情是,任何大于255或小于0的整数都将以包装方式转换,而不会引发溢出异常。例如:-1将转换为255,256将转换为0。就是这样,非常感谢。。。你能给我解释一下密码吗?我对i=>bytei.ToArray的含义有点困惑,它是如何生成字节的?i=>bytei被称为lambda表达式,是匿名函数的一种特殊符号。在本例中,它是一个接受参数的函数,将其转换为int,然后返回它。Select方法获取集合的每个元素,然后对它们调用lambda。ToArray方法将结果复制到数组中。看起来确实是个更好的选择。执行Linq查询时,结果存储在内部缓冲区中,然后复制到数组中。Array.ConvertAll直接分配一个数组,并在复制过程中进行转换。这可能解释了巨大的性能改进。我第一次听说Array.ConvertAll。看起来确实是个更好的选择。执行Linq查询时,结果存储在内部缓冲区中,然后复制到数组中。Array.ConvertAll直接分配一个数组,并在复制过程中进行转换。这可能解释了巨大的性能改进。