用UDPClient进行以太网通信,要向网络中广播发送一个结构体数据包
但是send函数仅能发送byte[],不知道如何将我声明的结构体对象转换为byte[]进行发送,谢谢
但是send函数仅能发送byte[],不知道如何将我声明的结构体对象转换为byte[]进行发送,谢谢
解决方案 »
- 设置SQL时间字段
- GRPS上网手机但没有MODEM功能,有没有办法连电脑上网?
- 关于C#数据库附加的
- C# for 循环问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。
- 帮帮忙了阿
- 请问有没有利用DbProviderFactories从machine.config读取配置来CreateConnection的例子?
- VS2005的奇怪问题
- 求多线程服务器的客户端/服务器游戏的开发源码
- 我想知道一些技术的适用情况,如在自定义服务器控件时,什么时候要实现IPostBackDataHandler接口及IPostBackEventHandler接口???????
- using System.Net.Http问题
- 怎么获得用户按了哪个按钮
- 如何将一个字符串模拟成一个磁盘文件使用。因为一个函数的参数需要一个磁盘文本文件名称,而上面存放的数据我已经在文本框中放置好了
/// 结构提转换BYTE
/// </summary>
/// <param name="p_StructObj">结构体</param>
/// <returns></returns>
public static byte[] StructToBytes(object p_StructObj)
{
int _StuctSize = Marshal.SizeOf(p_StructObj);
byte[] _StuctBytes = new byte[_StuctSize];
IntPtr _StructIntPtr = Marshal.AllocHGlobal(_StuctSize);
Marshal.StructureToPtr(p_StructObj, _StructIntPtr, false);
Marshal.Copy(_StructIntPtr, _StuctBytes, 0, _StuctSize);
Marshal.FreeHGlobal(_StructIntPtr);
return _StuctBytes;
}
好像还可以用API的一个方法转
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Management;namespace Util
{
public class NetStreamUtil
{
private static byte _fillChar = 0; //the fill character
//convert string to byte array in Ascii with length is len
public static byte[] StringToBytes(string str, int len)
{
if (string.IsNullOrEmpty(str))
{
str = string.Empty;
}
byte[] result = new byte[len];
byte[] strBytes = Encoding.Default.GetBytes(str); //copy the array converted into result, and fill the remaining bytes with 0
for (int i = 0; i < len; i++)
result[i] = ((i < strBytes.Length) ? strBytes[i] : _fillChar);
return result;
} /// <summary>
/// struct转换为byte[]
/// </summary>
/// <param name="structObj">结构体对象</param>
/// <returns>字节数组</returns>
public static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, false);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
} /// <summary>
/// byte[]转换为struct
/// </summary>
/// <param name="bytes"></param>
/// <param name="strcutType"></param>
/// <returns></returns>
public static object BytesToStruct(byte[] bytes, Type strcutType)
{
int size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
} /// <summary>
/// IntPtr转换成byte[]
/// </summary>
/// <param name="dataBuf"></param>
/// <param name="length"></param>
/// <returns></returns>
public byte[] ConvertToBytes(IntPtr dataBuf, int length)
{
byte[] byteBuf = new byte[length];
Marshal.Copy(dataBuf, byteBuf, 0, length);
return byteBuf;
} /// <summary>
/// 获得网卡号
/// </summary>
/// <returns></returns>
public static string GetNetCardMacAddress()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
string str = "";
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
str = mo["MacAddress"].ToString();
}
return str;
}
}
}
static void Main()
{
MyStruct s = new MyStruct();
s.Low = 5;
s.Hi = 10;
Console.WriteLine(s.Value);
byte[] b = new byte[4];
unsafe
{
MyStruct* sptr = &s;
fixed (byte* bptr = b)
for (int i = 0; i < sizeof(MyStruct); i++)
*(bptr + i) = *(((byte*)sptr) + i);
}
Console.WriteLine(BitConverter.ToString(b));
Console.ReadLine();
} [StructLayout(LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset(0)]
public int Value;
[FieldOffset(0)]
public short Low;
[FieldOffset(2)]
public short Hi;
}
这样反过来由byte还原为结构的代码也简单.
这样反过来由byte还原为结构的代码也简单.
这样反过来由byte还原为结构的代码也简单.