Structs til byte Arrays å sende over stikkontakter

stemmer
2

Hva er den beste måten å få en byte array fra en struct å sende over TCP sockets? Jeg bruker Net (VB eller C #).

Publisert på 16/03/2009 klokken 15:06
kilden bruker
På andre språk...                            


6 svar

stemmer
7

Hvis du bruker C #, kan du også marskalk den til en innfødt buffer selv, for å ha bedre kontroll over serialisering.

Du må legge til det aktuelle attributtet til struct,

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

Deretter kan du serial den ved hjelp av:

    /// <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;
    }
Svarte 16/03/2009 kl. 15:22
kilden bruker

stemmer
3

Du bør se nærmere serienumre . Det er mange alternativer tilgjengelige for deg, fra protokoll buffere (implementeringer av den første og andre rangert så brukere) for å xml til BinaryFormatter .

Svarte 16/03/2009 kl. 15:18
kilden bruker

stemmer
1

Hvorfor ikke bare bruke en binær leseren til å fylle felt av struct, og lese dem ut igjen? Alt du trenger å vite er størrelsen på feltene i struct og sin posisjon i strømmen, for administrerte løsninger .. Her er ingen grunn til et eksempel fra en waveplayer jeg skrev ..

    /// <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;
    }
Svarte 14/10/2013 kl. 17:07
kilden bruker

stemmer
1

Hvis du er villig til å ta vare på endian (for å kommunisere i et heterogent nettverk), den eneste måten å gjøre dette på er felt for felt.

Svarte 16/03/2009 kl. 15:10
kilden bruker

stemmer
0

Jeg antar C-språk, siden du sier "struct"

du kan bruke en funksjon som heter

ssize_t write (int fd, konst tomrom * buf, size_t teller);

hvor FD er filedescriptor av kontakten bufferen er adressen til strukturen, og antallet er størrelsen i byte

du vil bruke den som:

skrive (stikkontakt, og struct_var, sizeof (struct_var));

Svarte 16/03/2009 kl. 15:11
kilden bruker

stemmer
0

Du må være mer konkret og fortelle oss ditt språk.

For mange språk, er det ferdige rammer, eller deler av språkets standard miljø, for å gjøre slike ting.

Svarte 16/03/2009 kl. 15:09
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more