SilverlightのビッグエンディアンBitConverter?
-
20-08-2019 - |
質問
私は、SilverlightでMiscUtil.Conversionユーティリティを使用しようとしています。 http://www.yoda.arachsys.com/csharp/miscutil/する
私はそれをコンパイルしようとすると、、私はSilverlightののBitConverterクラスは、これらの2つの方法を持っていないというエラーを取得します:
DoubleToInt64Bits Int64BitsToDouble
まあ、私はリフレクターを開いて、mscorlibでそれらを見つけます:
public unsafe long DoubleToInt64Bits(double value)
{
return *(((long*)&value));
}
public unsafe double Int64BitsToDouble(long value)
{
return *(((double*) &value));
}
しかし、それに伴う問題は、Silverlightが危険なコードを許可していないということです。プロジェクトのプロパティ]メニューであり、「安全でないコードを許可する」の横の空のチェックボックスがありますが、あなたは値を変更することはできません。
どのように私はSilverlightでこれを行うことができますか?
解決
BitConverter.ToDouble(byte[], int)
と<を見てくださいhref = "http://msdn.microsoft.com/en-us/library/a5be4sc9.aspx" のrel = "nofollowをnoreferrer"> BitConverter.GetBytes(double)
を。彼らはSilverlightで存在する場合、それらは十分に良いかもしれません。私はとにかくプロトコルバッファのためにこれを調査するつもりだ - 私は良い解決策を見つけた場合、私は戻ってMiscUtilにポートことよ。
他のヒント
これはSilverlightで仕事をしたりしませんかどうかは知りませんが、それはコンソールアプリケーションで作業を行い、それが危険なコードを必要としません。
あなたはバイト配列にあなたのdouble型の値を得ることができる場合は、、あなたはエンディアンを変更するには、バイト配列内のバイトをスワップすることができます。このプロセスはまた戻って、二重にバイト配列を変え、逆にすることができます。
次のコードは、System.InteropServicesを使用して、ダブルバイト配列との間で変換する方法を示す図です。主な方法は、コンソールに2つの値を返す:8と3.14159。図8は、8バイトのバイト配列が正常に二重に基づいて作成されたことを示し、及び3.14159は、二重が正しくバイト配列から抽出されたことを示します。
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;
}
}
}