从结构体获取字节数组以通过 TCP 套接字发送的最佳方法是什么?我正在使用 .Net(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;
    }

其他提示

你应该调查一下 序列化. 。您有多种选择,从 协议 缓冲器 (由排名第一和第二的 SO 用户实现) XML二进制格式化程序.

如果您愿意照顾端序(在异构网络进行通信)的,要做到这一点的唯一方法是逐个字段。

为什么不直接使用二进制读取来填充结构的领域,并再次读出来?所有你需要知道的是在结构中的字段的大小和它的流中的位置,没有必要非托管的解决方案.. 下面是从一个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供写入(INT FD,常量无效* buf中,   为size_t计数);

其中FD是插座的文件描述符 该缓冲器是结构的地址,并且计数是字节大小

你可以使用它作为:

  

写(插座,&struct_var,的sizeof(struct_var));

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top