【问题标题】:How to copy int array value into byte array? only copy the value in C#如何将int数组值复制到字节数组中?仅复制 C# 中的值
【发布时间】:2012-08-30 11:19:59
【问题描述】:

你好,我有这种数组

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
...

【问题讨论】:

    标签: c# arrays integer bytearray


    【解决方案1】:
    streambit = arrayint.Select(i => (byte)i).ToArray();
    

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

    【讨论】:

    • 您可能想补充一点,在这种情况下,不应该有负值,并且相应的字节不会“相同”......
    • 这里要注意的一件有趣的事情是,任何大于 255 或小于 0 的整数都将以包装方式进行转换,而不会引发溢出异常。例如:-1 将转换为 255,256 将转换为 0。
    • 就是这样,非常感谢...你能解释一下代码吗?我对 i => (byte)i).ToArray() 的含义有点困惑,那是如何产生字节的?
    • i => (byte)i 被称为 lambda 表达式,是匿名函数的特殊符号。在这种情况下,它是一个接受参数的函数,将其转换为 int,然后返回它。 Select 方法获取集合中的每个元素,然后在它们上调用 lambda。 ToArray 方法将结果复制到数组中。
    【解决方案2】:

    没有 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 毫秒

    LINQ 耗时 6073 毫秒

    【讨论】:

    • 我第一次听说Array.ConvertAll。似乎确实是更好的选择。执行 Linq 查询时,结果存储在内部缓冲区中,然后复制到数组中。 Array.ConvertAll 直接分配一个数组并在复制过程中进行转换。它可能解释了巨大的性能改进。
    【解决方案3】:
    streambit=arrayint.Where(x=>x>=0&&x<=255).Select(y=>(byte)y).ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多