سؤال

ما هي أفضل طريقة للحصول على صفيف بايت من البنية لإرسال أكثر من مآخذ TCP؟ أنا باستخدام صافي (VB أو C #).

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

المحلول

إذا كنت تستخدم C #، يمكنك أيضا حشد لمن مواليد العازلة نفسك لتحقيق سيطرة أفضل على التسلسل.

وأنت في حاجة لإضافة السمة المناسبة للبنية الخاص بك،

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack=1)]

وبعد ذلك يمكنك ذلك باستخدام تسلسل:

    /// <summary>
    /// Serializes the specified object into a byte array.
    /// </summary>
    /// <param name="nativeObject">The object to serialize.</param>
    /// <returns></returns>
    public static byte[] Serialize(object obj)
    {
        Type objectType = obj.GetType();
        int objectSize = Marshal.SizeOf(obj);
        IntPtr buffer = Marshal.AllocHGlobal(objectSize);
        Marshal.StructureToPtr(obj, buffer, false);
        byte[] array = new byte[objectSize];
        Marshal.Copy(buffer, array , 0, objectSize);
        Marshal.FreeHGlobal(buffer);
        return array;
    }

نصائح أخرى

ويجب أن ننظر إلى التسلسل . هناك عدد من الخيارات المتاحة لك، من بروتوكول <لأ href = "HTTP: / /code.google.com/p/protobuf-net/ "يختلط =" نوفولو noreferrer "> المخازن (تطبيقات من 1 و2 في المرتبة المستخدمين SO) إلى <لأ href =" http://msdn.microsoft كوم / EN-US / مكتبة / ms950721.aspx "يختلط =" نوفولو noreferrer "> أكس لفي BinaryFormatter .

إذا كنت على استعداد لرعاية endian (على التواصل في شبكة غير متجانسة)، والطريقة الوحيدة للقيام بذلك هي الميدان الذي المجال.

لماذا لا مجرد استخدام قارئ ثنائي لملء مجالات البنية، وقراءتها مرة أخرى؟ كل ما تحتاج إلى معرفته هو حجم الحقول في البنية وانها موقف في تيار، لا حاجة لإيجاد حلول غير المدارة .. وهنا مثال من waveplayer كتبت ..

    /// <summary>Copies header to a stream</summary>
    /// <param name="waveData">Wav data stream</param>
    /// <param name="format">WAVEFORMATEX wav format</param>
    /// <returns>Stream</returns>
    public Stream CreateStream(Stream waveData, WAVEFORMATEX format)
    {
        MemoryStream stream = new MemoryStream();
        BinaryWriter writer = new BinaryWriter(stream);

        writer.Write(System.Text.Encoding.ASCII.GetBytes("RIFF".ToCharArray()));
        writer.Write((Int32)(waveData.Length + 36)); //File length minus first 8 bytes of RIFF description
        writer.Write(System.Text.Encoding.ASCII.GetBytes("WAVEfmt ".ToCharArray()));
        writer.Write((Int32)16); //length of following chunk: 16
        writer.Write((Int16)format.wFormatTag);
        writer.Write((Int16)format.nChannels);
        writer.Write((Int32)format.nSamplesPerSec);
        writer.Write((Int32)format.nAvgBytesPerSec);
        writer.Write((Int16)format.nBlockAlign);
        writer.Write((Int16)format.wBitsPerSample);
        writer.Write(System.Text.Encoding.ASCII.GetBytes("data".ToCharArray()));
        writer.Write((Int32)waveData.Length);

        waveData.Seek(0, SeekOrigin.Begin);
        byte[] b = new byte[waveData.Length];
        waveData.Read(b, 0, (int)waveData.Length);
        writer.Write(b);
        writer.Seek(0, SeekOrigin.Begin);
        return stream;
    }

وعليك أن تكون أكثر تحديدا وتقول لنا لغتك.

لغات عديدة، وهناك الأطر الجاهزة، أو حتى أجزاء من البيئة القياسية اللغة، وللقيام مثل هذه الامور.

وأفترض لغة C منذ تقول "البنية"

ويمكنك استخدام وظيفة تسمى

<اقتباس فقرة>   

وssize_t الكتابة (كثافة العمليات FD، الفراغ CONST * BUF،   عدد size_t)؛

وحيث FD هو filedescriptor من مقبس المخزن المؤقت هو عنوان للهيكل، والعد هو حجم بالبايت

والتي سوف تستخدم على النحو التالي:

<اقتباس فقرة>   

والكتابة (مأخذ، وstruct_var، sizeof (struct_var))؛

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