سؤال

وأنا أحاول أن استخدام الأداة المساعدة MiscUtil.Conversion في Silverlight. http://www.yoda.arachsys.com/csharp/miscutil/

وعندما أحاول ترجمة عليه، أحصل على خطأ قائلا الطبقة BitConverter سيلفرلايت لايوجد هاتين الطريقتين:

وDoubleToInt64Bits Int64BitsToDouble

حسنا، أنا فتحت العاكس ووجدتها في mscorlib:

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

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

ولكن المشكلة مع ذلك هو أن سيلفرلايت لا تسمح تعليمات برمجية غير آمنة. في القائمة خصائص المشروع هناك خانة فارغة بجوار "تسمح تعليمات برمجية غير آمنة"، ولكن لا يمكنك تغيير القيمة.

وكيف يمكنني أن أفعل هذا في Silverlight؟

هل كانت مفيدة؟

المحلول

وإلقاء نظرة على BitConverter.ToDouble(byte[], int) و < وأ href = "http://msdn.microsoft.com/en-us/library/a5be4sc9.aspx" يختلط = "نوفولو noreferrer"> BitConverter.GetBytes(double) . إذا كانت موجودة في Silverlight، فإنها قد تكون جيدة بما فيه الكفاية. انا ذاهب للتحقيق في هذا لبروتوكول المخازن على أي حال - إذا وجدت حلا جيدا، وسوف أكون الميناء مرة أخرى إلى MiscUtil

نصائح أخرى

وأنا لا أعرف اذا كان هذا العمل في Silverlight أو لا، ولكنه يعمل في تطبيق وحدة التحكم، وأنها لا تتطلب كود غير آمنة.

إذا يمكنك الحصول على قيم مزدوجة الخاص بك إلى صفيف بايت، يمكنك مبادلة بايت في صفيف بايت لتغيير endian نيس. كما يمكن عكس العملية، وتغيير صفيف بايت مرة أخرى إلى الضعف.

والتعليمات البرمجية التي التالي يوضح كيفية تحويل بين مزدوجة وصفيف بايت، وذلك باستخدام System.InteropServices. إرجاع الأسلوب الرئيسي قيمتين في وحدة التحكم: 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;
        }

    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top