2010-06-22 24 views
10

Intenté utilizar el método List.ConvertAll y fallé. Lo que estoy tratando de hacer es convertir un List<Int32> a byte[]Conversión de una lista de entradas a una matriz de bytes

I Copped y fuimos esta ruta, pero necesito averiguar el método ConvertAll ...

List<Int32> integers... 

internal byte[] GetBytes() 
{ 
    List<byte> bytes = new List<byte>(integers.Count * sizeof(byte)); 
    foreach (Int32 integer in integers) 
     bytes.AddRange(BitConverter.GetBytes(integer)); 

    return bytes.ToArray(); 
} 

Respuesta

15

Puesto que usted no quiere un byte[][] donde cada mapas enteros a una serie de cuatro bytes, no se puede llamar ConvertAll. (ConvertAll no se puede realizar una conversión de uno a muchos)

lugar, es necesario llamar al método de LINQ SelectMany para aplanar cada una matriz de bytes de GetBytes en una sola byte[]:

integers.SelectMany(BitConverter.GetBytes).ToArray() 
+0

OoOoO Me gusta. En cuanto a ConvertAll devolver un byte [] [], ese era el problema exacto que estaba teniendo y estaba totalmente perplejo. ¡Gracias! – MQS

+1

para aquellos que no se han movido a Visual Studio 2010, la sintaxis es ints.SelectMany (i => BitConverter.GetBytes (i)). ToArray() – zonkflut

+0

@zonkflut: O 'enteros.SelectMany (BitConverter.GetBytes) .ToArray () ' – SLaks

3

¿Qué tal

var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray(); 

no probado por cierto, pero parece razonable.

Esto realmente debería darle una matriz de matrices de bytes ... que pueden ser o no lo que necesita. Si desea contraer en una sola matriz, puede utilizar SelectMany

var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray(); 
2

El método ConvertAll es defectuoso porque espera que haya un mapeo 1: 1 desde el origen hasta el destino. Esto no es cierto al convertir enteros a bytes. Es mucho mejor ir con una solución como lo que @SLaks ha sugerido con el método de extensión SelectMany.

1

Para utilizar el método ConvertAll se puede hacer lo siguiente ...

Asumiendo que usted tiene una lista de enteros que son realmente los valores de byte y que en realidad no quiere que los bytes necesarios para compensar un int, es decir, byte[][]:

public static class Utility { 

    public static byte IntToByte(int i) { 
     if(i < 0) 
      return (byte)0; 
     else if(i > 255) 
      return (byte)255; 
     else 
      return System.Convert.ToByte(i); 
    } 
} 

... para convertir ...

byte[] array = listOfInts.ConvertAll(
        new Converter<byte, int>(Utility.IntToByte)).ToArray(); 

o puede utilizar un delegado anónimo ...

byte[] array = listOfInts.ConvertAll(new Converter<byte, int>(
        delegate(int i) { 
         if(i < 0) 
          return (byte)0; 
         else if(i > 255) 
          return (byte)255; 
         else 
          return System.Convert.ToByte(i); 
        })).ToArray(); 
+1

System.Convert.ToByte lanzará una OverflowException si el valor es mayor que byte.MaxValue. –

+0

Es cierto, valide el número entero y ciérrelo si supera 255 o es menor que 0. Creo que la pregunta es cómo usar ConvertAll ... –

Cuestiones relacionadas