我正在寻找一个函数,可以将标准IPv4地址转换为整数。如果函数能够实现反向转换,则可获得额外积分。解决方案应使用C#编写。
public static Int32 getLongIPAddress(string ipAddress)
{
return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0));
}
以上示例是我所采用的方式。唯一需要做的事情可能是将其转换为UInt32以便于显示,或者转换为字符串,包括在字符串形式下使用它作为长地址。
这就是在使用IPAddress.Parse(String)函数时所需的。哎。
将IP地址的所有部分乘以256的幂次方(256x256x256,256x256,256和1)。例如:
IPv4地址:127.0.0.1 32位数字: = (127x256^3)+(0x256^2)+(0x256^1)+1 = 2130706433
int ipToInt(int first, int second,
int third, int fourth)
{
return Convert.ToInt32((first * Math.Pow(256, 3))
+ (second * Math.Pow(256, 2)) + (third * 256) + fourth);
}
first
到 fourth
是 IPv4 地址的四个段。
public bool TryParseIPv4Address(string value, out uint result)
{
IPAddress ipAddress;
if (!IPAddress.TryParse(value, out ipAddress) ||
(ipAddress.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork))
{
result = 0;
return false;
}
result = BitConverter.ToUInt32(ipAddress.GetAddressBytes().Reverse().ToArray(), 0);
return true;
}
@Davy Ladman,你的解决方案使用移位是正确的,但仅适用于以数字小于或等于99开头的IP地址。实际上,第一个八位组必须转换为长整型。
无论如何,使用长整型进行转换相当困难,因为它需要存储64位(而不是32位),并用零填充4个字节。
static uint ToInt(string addr)
{
return BitConverter.ToUInt32(IPAddress.Parse(addr).GetAddressBytes(), 0);
}
static string ToAddr(uint address)
{
return new IPAddress(address).ToString();
}
享受吧!
马西莫
var address = IPAddress.Parse("10.0.11.174").GetAddressBytes();
long m_Address = ((address[3] << 24 | address[2] << 16 | address[1] << 8 | address[0]) & 0x0FFFFFFFF);
public static uint IpToUInt32(string ip)
{
if (!IPAddress.TryParse(ip, out IPAddress address)) return 0;
return BitConverter.ToUInt32(address.GetAddressBytes(), 0);
}
public static string UInt32ToIp(uint address)
{
return new IPAddress(address).ToString();
}
这是我今天想出来的一个解决方案(应该先谷歌一下!):
private static string IpToDecimal2(string ipAddress)
{
// need a shift counter
int shift = 3;
// loop through the octets and compute the decimal version
var octets = ipAddress.Split('.').Select(p => long.Parse(p));
return octets.Aggregate(0L, (total, octet) => (total + (octet << (shift-- * 8)))).ToString();
}
我正在使用LINQ、Lambda和一些泛型扩展,虽然它产生了相同的结果,但它使用了一些新的语言特性,你可以用三行代码完成。
如果您感兴趣,我在我的博客上有解释。
祝好, -jc
string[] vals = inVal.Split('.');
uint output = 0;
for (byte i = 0; i < vals.Length; i++) output += (uint)(byte.Parse(vals[i]) << 8 * (vals.GetUpperBound(0) - i));
int
也无法容纳大于127.255.255.255
的地址,例如广播地址,因此请使用uint
。 - Saeb AminiNetworkToHostOrder
来反转字节。且int可以包含大于127.255.255.255
的地址;它们以负数形式存储。当将类型转换为int时,Address
属性中大于2^31的数字,即long
类型,会变成负数;将其转换为int是为了调用NetworkToHostOrder
,并且不会截断数字。 - Barry Kelly