Domanda

Sto cercando di utilizzare l'utilità MiscUtil.Conversion in Silverlight. http://www.yoda.arachsys.com/csharp/miscutil/

Quando provo a compilarlo, ricevo un errore che dice che la classe BitConverter di Silverlight non ha questi due metodi:

DoubleToInt64Bits Int64BitsToDouble

Beh, ho aperto Reflector e li ho trovati in mscorlib:

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

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

Ma il problema è che Silverlight non consente il codice non sicuro. Nel menu delle proprietà del progetto c'è una casella vuota accanto a & Quot; consenti codice non sicuro & Quot ;, ma non puoi cambiare il valore.

Come posso farlo in Silverlight?

È stato utile?

Soluzione

Dai un'occhiata a BitConverter.ToDouble(byte[], int) e BitConverter.GetBytes(double) . Se esistono in Silverlight, potrebbero essere abbastanza buoni. Lo esaminerò comunque per i buffer di protocollo - se trovo una buona soluzione, la porto nuovamente su MiscUtil.

Altri suggerimenti

Non so se funzionerà in Silverlight o meno, ma funziona in un'applicazione Console e non richiede codice non sicuro.

Se riesci a ottenere i tuoi doppi valori in una matrice di byte, puoi scambiare i byte nella matrice di byte per cambiare endian-ness. Il processo può anche essere invertito, cambiando l'array di byte in un doppio.

Il codice che segue mostra come convertire tra array double e byte, usando System.InteropServices. Il metodo Main restituisce due valori nella console: 8 e 3.14159. L'8 indica che una matrice di byte di 8 byte è stata creata correttamente dal doppio e 3.14159 indica che la doppia è stata correttamente estratta dall'array di byte.

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;
        }

    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top