Pregunta

Estoy tratando de usar la utilidad MiscUtil.Conversion en Silverlight. http://www.yoda.arachsys.com/csharp/miscutil/

Cuando intento compilarlo, aparece un error que dice que la clase BitConverter de Silverlight no tiene estos dos métodos:

DoubleToInt64Bits Int64BitsToDouble

Bueno, abrí Reflector y los encontré en mscorlib:

public unsafe long DoubleToInt64Bits(double value)
{
  return *(((long*)&value));
}

public unsafe double Int64BitsToDouble(long value)
{
  return *(((double*) &value));
}

Pero el problema con eso es que Silverlight no permite código inseguro. En el menú de propiedades del proyecto hay una casilla de verificación vacía al lado de & Quot; permitir código inseguro & Quot ;, pero no puede cambiar el valor.

¿Cómo puedo hacer esto en Silverlight?

¿Fue útil?

Solución

Eche un vistazo a BitConverter.ToDouble(byte[], int) y BitConverter.GetBytes(double) . Si existen en Silverlight, pueden ser lo suficientemente buenos. Voy a investigar esto para Protocol Buffers de todos modos; si encuentro una buena solución, la portaré de regreso a MiscUtil.

Otros consejos

No sé si esto funcionará en Silverlight o no, pero funciona en una aplicación de consola y no requiere código inseguro.

Si puede obtener sus valores dobles en una matriz de bytes, puede intercambiar los bytes en la matriz de bytes para cambiar la endianidad. El proceso también se puede revertir, cambiando la matriz de bytes a un doble.

El código que sigue ilustra cómo convertir entre matrices dobles y de bytes, usando System.InteropServices. El método Main devuelve dos valores en la consola: 8 y 3.14159. El 8 indica que se creó con éxito una matriz de bytes de 8 bytes a partir del doble, y 3.14159 indica que el doble se extrajo correctamente de la matriz de bytes.

using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double d = 3.14159d;
            byte[] b = ToByteArray(d);
            Console.WriteLine(b.Length);
            Console.ReadLine();
            double n = FrpmByteArray(b);
            Console.WriteLine(n.ToString());
            Console.ReadLine();
        }
        public static byte[] ToByteArray(object anything)
        {
            int structsize = Marshal.SizeOf(anything);
            IntPtr buffer = Marshal.AllocHGlobal(structsize);
            Marshal.StructureToPtr(anything, buffer, false);
            byte[] streamdatas = new byte[structsize];
            Marshal.Copy(buffer, streamdatas, 0, structsize);
            Marshal.FreeHGlobal(buffer);
            return streamdatas;
        }
        public static double FromByteArray(byte[] b)
        {
            GCHandle handle = GCHandle.Alloc(b, GCHandleType.Pinned);
            double d = (double)Marshal.PtrToStructure(
                handle.AddrOfPinnedObject(),
                typeof(double));
            handle.Free();
            return d;
        }

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top