通过套接字发送的字节数组结构
-
19-08-2019 - |
题
从结构体获取字节数组以通过 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;
}
其他提示
如果您愿意照顾端序(在异构网络进行通信)的,要做到这一点的唯一方法是逐个字段。
为什么不直接使用二进制读取来填充结构的领域,并再次读出来?所有你需要知道的是在结构中的字段的大小和它的流中的位置,没有必要非托管的解决方案.. 下面是从一个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));
不隶属于 StackOverflow