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直接分配一个数组,并在复制过程中进行转换。这可能解释了巨大的性能改进。