3

Silverlight で MiscUtil.Conversion ユーティリティを使用しようとしています。 http://www.yoda.arachsys.com/csharp/miscutil/

コンパイルしようとすると、Silverlight の BitConverter クラスには次の 2 つのメソッドがないというエラーが表示されます。

DoubleToInt64Bits Int64BitsToDouble

さて、Reflector を開いて mscorlib で見つけました。

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

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

しかし、問題は、Silverlight ではアンセーフ コードが許可されないことです。プロジェクトのプロパティ メニューの [安全でないコードを許可する] の横に空のチェックボックスがありますが、値を変更することはできません。

Silverlight でこれを行うにはどうすればよいですか?

4

2 に答える 2

3

を見てBitConverter.ToDouble(byte[], int)くださいBitConverter.GetBytes(double)。それらがSilverlightに存在する場合は、十分に優れている可能性があります。とにかく、Protocol Buffersについてこれを調査します。適切な解決策が見つかった場合は、MiscUtilに移植します。

于 2009-06-29T05:41:42.307 に答える
0

これがSilverlightで機能するかどうかはわかりませんが、コンソールアプリケーションでは機能し、安全でないコードは必要ありません。

double値をバイト配列に入れることができる場合は、バイト配列のバイトを交換してエンディアンを変更できます。このプロセスを逆にして、バイト配列をdoubleに戻すこともできます。

次のコードは、System.InteropServicesを使用してdouble配列とbyte配列を変換する方法を示しています。Mainメソッドは、コンソールに8と3.14159の2つの値を返します。8は、doubleから8バイトのバイト配列が正常に作成されたことを示し、3.14159は、doubleがバイト配列から正しく抽出されたことを示します。

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

    }
}
于 2009-06-29T06:11:15.710 に答える