C# 如何将IP地址转换为MAC地址字节数组?

C# 如何将IP地址转换为MAC地址字节数组?,c#,winforms,bytearray,mac-address,arp,C#,Winforms,Bytearray,Mac Address,Arp,我正在尝试将IP地址转换为MAC地址,然后将其转换为字节数组。我被困在第一部分,不知道如何做到这一点。我看到一些搜索结果谈论System.Net.NetworkInformation.NetworkInterface,但不知道如何使用它 这是我需要MAC字节数组的代码。如何做到这一点 [DllImport("iphlpapi.dll", ExactSpelling = true)] public static extern int SendARP(int DestIP, int SrcIP, b

我正在尝试将IP地址转换为MAC地址,然后将其转换为字节数组。我被困在第一部分,不知道如何做到这一点。我看到一些搜索结果谈论
System.Net.NetworkInformation.NetworkInterface
,但不知道如何使用它

这是我需要MAC字节数组的代码。如何做到这一点

[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);

private void Ping(IPAddress address)
{
    byte[] macAddr = new byte[6];
    uint macAddrLen = uint.Parse(macAddr.Length.ToString());

    if (SendARP(int.Parse(address.ToString()), 0, macAddr, ref macAddrLen) == 0)
    {
        //SUCCESS!
    }
}
看看:

byte[]macAddr=新字节[6];
uint macAddrLen=(uint)macAddr.Length;
if(SendARP((int)address.address,0,macAddr,ref macAddrLen)!=0)
抛出新的InvalidOperationException(“SendARP失败”);
字符串[]str=新字符串[(int)macAddrLen];
for(int i=0;i
看看:

byte[]macAddr=新字节[6];
uint macAddrLen=(uint)macAddr.Length;
if(SendARP((int)address.address,0,macAddr,ref macAddrLen)!=0)
抛出新的InvalidOperationException(“SendARP失败”);
字符串[]str=新字符串[(int)macAddrLen];
for(int i=0;i
实际上,MAC地址是给您的。您不需要知道计算机的MAC地址。调用函数SendARP后,macAddr将保留MAC地址

在中,您可以看到参数macAddr和macAddrLen标记为[out],这意味着函数使用此参数返回值


其要点是,您可以将网络层地址(IP)解析为物理地址(MAC)

实际上,MAC地址是给您的。您不需要知道计算机的MAC地址。调用函数SendARP后,macAddr将保留MAC地址

在中,您可以看到参数macAddr和macAddrLen标记为[out],这意味着函数使用此参数返回值


整个问题的关键在于,您可以将网络层地址(IP)解析为物理地址(MAC)

了解您尝试执行的操作。把你的电话号码翻译成街道的名字是一件很简单的事——它们之间没有任何关联


MAC地址在以太网级驱动程序中进行编码,而IP地址是IP协议的上层人工构造。他们没有任何关系。路由器通过aprotocol(ARP-地址解析协议)找到要向其发送IP数据包的MAC地址,而这不能跨网段。

了解您试图做的事情。把你的电话号码翻译成街道的名字是一件很简单的事——它们之间没有任何关联


MAC地址在以太网级驱动程序中进行编码,而IP地址是IP协议的上层人工构造。他们没有任何关系。路由器通过aprotocol(ARP-地址解析协议)找到要向其发送IP数据包的MAC地址,这不能跨网段。

您想做什么?MAC地址是不可访问的,除非在主机上,所以我不明白你的意思question@CharlesB,我在努力工作。问题是我的最后一个变量MacAddressLen没有分配。适配器的MAC地址仅在同一网段上可用。不在路由器的另一边。你想做什么?MAC地址是不可访问的,除非在主机上,所以我不明白你的意思question@CharlesB,我在努力工作。问题是我的最后一个变量MacAddressLen没有分配。适配器的MAC地址仅在同一网段上可用。不在路由器的另一边。解释得很清楚。好吧,所以我一直用错误的方式看待它+1.解释得很清楚。好吧,所以我一直用错误的方式看待它+1.我正在尝试此代码,但与我的代码相同,它在if语句行导致错误:输入字符串的格式不正确。你知道为什么吗?@HelpNeeder请看我的编辑。错误出现在对int.Parse的调用中(将地址转换为字符串将返回无法转换为int的“x.x.x.x”形式的IP)。代码不起作用,因为您试图将IP转换为字符串,然后将其解析为int->int.Parse(address.ToString())。要使代码正常工作,您需要一个IPaddress对象,然后像这样使用它:(int)YourIPObject。Address@R34lthing,int.Parse(address.address)并不能完全解决这个问题。我需要int.Parse(address.address.ToString()),这样它甚至可以编译。现在的问题是,我的地址范围从255.255.255.0到255.255.255.127,然后我得到一个错误:值对于Int32太大或太小。没关系。我已经解决了将第一个参数的类型更改为字符串的问题。我正在尝试此代码,但与我的代码相同,它会在if语句行导致错误:输入字符串的格式不正确。你知道为什么吗?@HelpNeeder请看我的编辑。错误出现在对int.Parse的调用中(将地址转换为字符串将返回无法转换为int的“x.x.x.x”形式的IP)。代码不起作用,因为您试图将IP转换为字符串,然后将其解析为int->int.Parse(address.ToString())。要使代码正常工作,您需要一个IPaddress对象,然后像这样使用它:(int)YourIPObject。Address@R34lthing,int.Parse(address.address)并不能完全解决这个问题。我需要int.Parse(address.address.ToString()),这样它甚至可以编译。现在的问题是,我的地址范围从255.255.255.0到255.255.255.127,然后我得到一个错误:值对于Int32太大或太小。没关系。我已经解决了这个问题,将第一个参数的类型更改为字符串。
byte[] macAddr = new byte[6];
uint macAddrLen = (uint) macAddr.Length;
if (SendARP((int)address.Address, 0, macAddr, ref macAddrLen) != 0)
    throw new InvalidOperationException("SendARP failed.");

string[] str = new string[(int)macAddrLen];
for (int i = 0; i < macAddrLen; i++)
    str[i] = macAddr[i].ToString("x2");

Console.WriteLine(string.Join(":", str));