从字节数组创建任意数量的对象。 Dhcp包C#
Create any number of objects from byte array. Dhcp package C#
我目前正在开发一个 public 库,它允许您创建一个包含各种选项(如 dhcp 选项)的 dhcp 包。创建它时,会创建一个字节数组,您可以通过 UdpSocket 将其作为负载发送。我为此创建了两个 classes:1.dhcppacket,2.dhcpoption。到目前为止,已经可以使用任何 DhcpOptions 创建 Dhcp 数据包。
现在我想解析以字节数组形式传递的传入 DhcpPacket 返回 DhcpPacket 对象,以便能够读取重要信息,例如消息类型或从传递的 DhcpOptions(例如子网掩码)中读取。 DhcpPacket 的固定部分(开始)我已经同意了。但是现在我使用 DhcpOptions 失败了,因为它们是可变的。如何从字节数组创建 X 对象。
给定的是一个未给定长度的字节数组
dhcpOptions = pPayload.Skip(240).ToArray();
我现在想从这个负载创建 class“DhcpOption”的对象。每个 Dhcp 选项都以一个唯一的字节开头,例如0x01 = 包含子网掩码的 DhcpOption。然后是一个字节,表示DhcpOption的长度,包括以下值。例如,如果 DNS 服务器通过 Dhcp 选项进行通信,则长度为 0x04,因为 IPv4 地址作为值传输。因此,有效负载中 Dhcp 选项的总长度为 6 个字节。但是由于所有选项的长度都不相同,所以我不知道如何准确地到达下一个 DHCP 选项的开头。
从 ByteArray 创建 dhcp 选项的示例:
DhcpOption option = new DhcpOption{
optionId = byteArray[0],
optionLength = byteArray[1],
optionValue = byteArray.Skip(2).Take(optionLength).ToArray(),
};
搜索到 class:
的 X-Object
public class DhcpOption
{
/// <summary>
/// Define the DHCP options to be created by name
/// </summary>
public dhcpOptionIds optionId { get; set; } = new dhcpOptionIds();
private byte[] optionIdBytes = new byte[] { };
/// <summary>
/// Define the required length for the optionValue
/// </summary>
public byte[] optionLength { get; set; } = new byte[] { };
/// <summary>
/// Define the value for the option e.g. subnet mask
/// </summary>
public byte[] optionValue { get; set; } = new byte[] { };
/// <summary>
/// Create the DHCP option as byte array. Is then specified as an option in the DhcpPacket.
/// </summary>
/// <returns></returns>
public byte[] buildDhcpOption()
{
object selected = Convert.ChangeType(optionId, optionId.GetTypeCode());
optionIdBytes = new byte[] { Convert.ToByte(selected, null) };
return optionIdBytes.Concat(optionLength).Concat(optionValue).ToArray();
}
}
我想要一个 dhcp 选项列表,而不是纯字节数组。因此 List<DhcpOption>
可用于使用 for 或 foreach 搜索所需的 Dhcp 选项,然后读出该值。
这是 GitHub 存储库,因此我不必复制代码。
https://github.com/Marschall-dev/DhcpDotNet/blob/main/DhcpDotNet/DhcpDotNet/DhcpPacket.cs
如果您有需要遵循的固定协议,我使用的典型方法是 BinaryReader/BinaryWriter。
从字节数组创建一个内存流并提供给 binaryReader。如果您有多个不同选项的列表,则每个选项的数据应以选项类型和可选的长度为前缀。所以你可以先读取选项的类型,然后有一个开关来处理每个特定的选项类型。重复此操作,直到读取所有选项。
序列化和反序列化通常应该互为逆序,因此您可能希望使用 BinaryWriter 进行序列化。单元测试对于确保您可以在不涉及任何网络连接的情况下序列化和反序列化消息非常有用。如果您不需要遵循现有协议,我会推荐一个序列化库,例如 protobuf.net.
我目前正在开发一个 public 库,它允许您创建一个包含各种选项(如 dhcp 选项)的 dhcp 包。创建它时,会创建一个字节数组,您可以通过 UdpSocket 将其作为负载发送。我为此创建了两个 classes:1.dhcppacket,2.dhcpoption。到目前为止,已经可以使用任何 DhcpOptions 创建 Dhcp 数据包。
现在我想解析以字节数组形式传递的传入 DhcpPacket 返回 DhcpPacket 对象,以便能够读取重要信息,例如消息类型或从传递的 DhcpOptions(例如子网掩码)中读取。 DhcpPacket 的固定部分(开始)我已经同意了。但是现在我使用 DhcpOptions 失败了,因为它们是可变的。如何从字节数组创建 X 对象。
给定的是一个未给定长度的字节数组
dhcpOptions = pPayload.Skip(240).ToArray();
我现在想从这个负载创建 class“DhcpOption”的对象。每个 Dhcp 选项都以一个唯一的字节开头,例如0x01 = 包含子网掩码的 DhcpOption。然后是一个字节,表示DhcpOption的长度,包括以下值。例如,如果 DNS 服务器通过 Dhcp 选项进行通信,则长度为 0x04,因为 IPv4 地址作为值传输。因此,有效负载中 Dhcp 选项的总长度为 6 个字节。但是由于所有选项的长度都不相同,所以我不知道如何准确地到达下一个 DHCP 选项的开头。
从 ByteArray 创建 dhcp 选项的示例:
DhcpOption option = new DhcpOption{
optionId = byteArray[0],
optionLength = byteArray[1],
optionValue = byteArray.Skip(2).Take(optionLength).ToArray(),
};
搜索到 class:
的 X-Objectpublic class DhcpOption
{
/// <summary>
/// Define the DHCP options to be created by name
/// </summary>
public dhcpOptionIds optionId { get; set; } = new dhcpOptionIds();
private byte[] optionIdBytes = new byte[] { };
/// <summary>
/// Define the required length for the optionValue
/// </summary>
public byte[] optionLength { get; set; } = new byte[] { };
/// <summary>
/// Define the value for the option e.g. subnet mask
/// </summary>
public byte[] optionValue { get; set; } = new byte[] { };
/// <summary>
/// Create the DHCP option as byte array. Is then specified as an option in the DhcpPacket.
/// </summary>
/// <returns></returns>
public byte[] buildDhcpOption()
{
object selected = Convert.ChangeType(optionId, optionId.GetTypeCode());
optionIdBytes = new byte[] { Convert.ToByte(selected, null) };
return optionIdBytes.Concat(optionLength).Concat(optionValue).ToArray();
}
}
我想要一个 dhcp 选项列表,而不是纯字节数组。因此 List<DhcpOption>
可用于使用 for 或 foreach 搜索所需的 Dhcp 选项,然后读出该值。
这是 GitHub 存储库,因此我不必复制代码。
https://github.com/Marschall-dev/DhcpDotNet/blob/main/DhcpDotNet/DhcpDotNet/DhcpPacket.cs
如果您有需要遵循的固定协议,我使用的典型方法是 BinaryReader/BinaryWriter。
从字节数组创建一个内存流并提供给 binaryReader。如果您有多个不同选项的列表,则每个选项的数据应以选项类型和可选的长度为前缀。所以你可以先读取选项的类型,然后有一个开关来处理每个特定的选项类型。重复此操作,直到读取所有选项。
序列化和反序列化通常应该互为逆序,因此您可能希望使用 BinaryWriter 进行序列化。单元测试对于确保您可以在不涉及任何网络连接的情况下序列化和反序列化消息非常有用。如果您不需要遵循现有协议,我会推荐一个序列化库,例如 protobuf.net.