Silverlight 中的 BigEndianBitConverter?
-
20-08-2019 - |
题
我正在尝试在 Silverlight 中使用 MiscUtil.Conversion 实用程序。http://www.yoda.arachsys.com/csharp/miscutil/
当我尝试编译它时,收到一条错误消息,指出 Silverlight 的 BitConverter 类没有这两个方法:
doubleToint64bits int64bitstodouble
好吧,我打开 Reflector 并在 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)
和 BitConverter.GetBytes(double)
. 。如果它们存在于 Silverlight 中,那么它们可能就足够好了。无论如何,我都会针对 Protocol Buffers 进行调查 - 如果我找到一个好的解决方案,我会将其移植回 MiscUtil。
其他提示
我不知道这是否会在Silverlight或不工作,但它在一个控制台应用程序的工作,它不需要不安全的代码。
如果你能得到你的双值转换为字节数组,你可以交换字节的字节数组中改变字节序。该过程也可以颠倒,改变的字节数组返回到双。
下面的代码说明了如何双和字节数组之间进行转换,利用System.InteropServices。 Main方法在控制台返回两个值: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;
}
}
}
不隶属于 StackOverflow