2011-08-05 23 views
11

¿Cómo convierto una matriz double[] en una matriz byte[] y viceversa?Conversión de matriz doble a matriz de bytes

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(sizeof(double)); 
     Console.WriteLine(double.MaxValue); 

     double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 }; 
     byte[] convertedarray = ? 

     Console.Read(); 
    } 
} 
+0

¿Quieres la conversión del valor (es decir. '10.0' -> 10) o los ocho bytes de la representación de la máquina subyacente (p. Ej., Para la serialización)? – Richard

+1

¿De qué tipo de conversión estamos hablando aquí? ¿Desea tomar el doble correspondiente y "lanzarlo" a un tipo integral para obtener el valor de byte? ¿O desea obtener la representación de bytes de cada uno de los valores dobles? Necesitas _clarificar_. –

+0

intención es utilizar la función BinaryWriter.Write(). Pero esto solo acepta bytes. Quiero obtener la representación de bytes de cada uno de los valores dobles? – Raghaav

Respuesta

15

Suponiendo que desea el dobles colocados en la correspondiente matriz de bytes, una tras otra, LINQ puede hacer el trabajo por debajo de esto:

static byte[] GetBytes(double[] values) 
{ 
    return values.SelectMany(value => BitConverter.GetBytes(value)).ToArray(); 
} 

Como alternativa, se puede usar Buffer.BlockCopy():

static byte[] GetBytesAlt(double[] values) 
{ 
    var result = new byte[values.Length * sizeof(double)]; 
    Buffer.BlockCopy(values, 0, result, 0, result.Length); 
    return result; 
} 

Para convertir de nuevo:

static double[] GetDoubles(byte[] bytes) 
{ 
    return Enumerable.Range(0, bytes.Length/sizeof(double)) 
     .Select(offset => BitConverter.ToDouble(bytes, offset * sizeof(double))) 
     .ToArray(); 
} 

static double[] GetDoublesAlt(byte[] bytes) 
{ 
    var result = new double[bytes.Length/sizeof(double)]; 
    Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length); 
    return result; 
} 
+1

GetBytesAlt funciona más rápido que GetBytes en mi caso. ¡Gracias! – RredCat

+0

La versión de BlockCopy es genial. Gracias por eso. –

-1
var byteArray = (from d in doubleArray 
       select (byte)d) 
       .ToArray(); 

var doubleArray = (from b in byteArray 
        select (double)b) 
        .ToArray(); 

Cheers.

+0

Esto eliminará algunos datos de dobles grandes. – VMAtm

+0

Bueno, está bien. Creo que la pregunta no era lo suficientemente clara. –

+0

Pregunta: sí, pero se borró en los comentarios. – VMAtm

0

Puede usar algo como esto, pienso:

byte[] byteArray = new byteArray[...]; 
... 
byteArray.SetValue(Convert.ToByte(d), index); 
2
double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 }; 
byte[] convertedarray = array.Select(x => Convert.ToByte(x)).ToArray(); 
+0

cómo convertir el byte [] a doble []. – Raghaav

0

que puedes usar Buffer.BlockCopy método.

Mire el ejemplo de las páginas, lo comprenderá claramente.

doubleArray = byteArray.Select(n => {return Convert.ToDouble(n);}).ToArray(); 
6

Se pueden utilizar los métodos Select y ToArray para convertir una matriz a otra:

oneArray = anotherArray.Select(n => { 
    // the conversion of one item from one type to another goes here 
}).ToArray(); 

convertir de doble byte:

byteArray = doubleArray.Select(n => { 
    return Convert.ToByte(n); 
}).ToArray(); 

convertir de bytes para duplicar se simplemente cambie la parte de conversión:

doubleArray = byteArray.Select(n => { 
    return Convert.ToDouble(n); 
}).ToArray(); 

Si desea convertir cada doble a una representación de varios bytes, puede utilizar el método SelectMany y la clase BitConverter. Como cada doble dará como resultado una matriz de bytes, el método SelectMany los aplanará en un único resultado.

byteArray = doubleArray.SelectMany(n => { 
    return BitConverter.GetBytes(n); 
}).ToArray(); 

Para convertir de nuevo a los dobles, lo que se necesita para recorrer los bytes ocho a la vez:

doubleArray = Enumerable.Range(0, byteArray.Length/8).Select(i => { 
    return BitConverter.ToDouble(byteArray, i * 8); 
}).ToArray(); 
+0

Eso es absolutamente correcto. +1 –

Cuestiones relacionadas