Pergunta

Eu estou tentando usar o utilitário MiscUtil.Conversion em Silverlight. http://www.yoda.arachsys.com/csharp/miscutil/

Quando tento compilá-lo, eu recebo um erro dizendo classe BitConverter do Silverlight não tem esses dois métodos:

DoubleToInt64Bits Int64BitsToDouble

Bem, eu abri refletor e os achou em mscorlib:

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

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

Mas o problema com isto é que o Silverlight não permitir que o código inseguro. No menu de propriedades do projeto há uma caixa vazia ao lado de "permitir que o código inseguro", mas você não pode mudar o valor.

Como posso fazer isso no Silverlight?

Foi útil?

Solução

Tenha um olhar em BitConverter.ToDouble(byte[], int) e < a href = "http://msdn.microsoft.com/en-us/library/a5be4sc9.aspx" rel = "nofollow noreferrer"> BitConverter.GetBytes(double) . Se eles existem em Silverlight, eles podem muito bem ser bom o suficiente. Vou investigar isso para Protocol Buffers de qualquer maneira -. Se eu encontrar uma boa solução, eu vou transportá-lo de volta para MiscUtil

Outras dicas

Eu não sei se isso vai funcionar em Silverlight ou não, mas ela não funciona em um aplicativo de console, e não requer código inseguro.

Se você pode obter seus valores double em um array de bytes, você pode trocar os bytes na matriz de bytes para mudar endian-ness. O processo também pode ser invertida, passando a matriz volta de bytes em um duplo.

O código que se segue ilustra como converter entre matriz dupla e de byte, usando System.InteropServices. O principal método retorna dois valores no console: 8 e 3,14159. A 8 indica que uma matriz de bytes de 8 bytes foi criado com sucesso a partir da dupla, e 3,14159 indica que a dupla foi extraída correctamente a partir da 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top