C# 高八位位组的代码首先被破坏。在Ubuntu Linux 10.04上的Opera 11中确认:它将int转换回熟悉的w.x.y.z形式,并且有效。IPAddress.Address在.Net 4.0中已过时。@ErikPhilips如果只使用IPv4,这是
C# 高八位位组的代码首先被破坏。在Ubuntu Linux 10.04上的Opera 11中确认:它将int转换回熟悉的w.x.y.z形式,并且有效。IPAddress.Address在.Net 4.0中已过时。@ErikPhilips如果只使用IPv4,这是,c#,integer,ip,ipv4,C#,Integer,Ip,Ipv4,高八位位组的代码首先被破坏。在Ubuntu Linux 10.04上的Opera 11中确认:它将int转换回熟悉的w.x.y.z形式,并且有效。IPAddress.Address在.Net 4.0中已过时。@ErikPhilips如果只使用IPv4,这是否重要?这是一个体系结构决定。它有它的优点和缺点,并且注释不是讨论该特定问题的最佳位置。您可以使用BitConverter.ToUInt32(IPAddress.Parse(value).GetAddressBytes().Reverse().
高八位位组的代码首先被破坏。在Ubuntu Linux 10.04上的Opera 11中确认:它将int转换回熟悉的w.x.y.z形式,并且有效。IPAddress.Address在.Net 4.0中已过时。@ErikPhilips如果只使用IPv4,这是否重要?这是一个体系结构决定。它有它的优点和缺点,并且注释不是讨论该特定问题的最佳位置。您可以使用BitConverter.ToUInt32(IPAddress.Parse(value).GetAddressBytes().Reverse().ToArray()来修复IPAddress.Address已过时警告:由接受的答案生成的整数将是错误的,因为IP地址是按网络顺序排列的(大端语),而在大多数系统中,
int
s是小尾数。因此,在转换之前必须反转字节。有关正确的转换,请参阅。此外,即使对于IPv4,int
也不能保存大于127.255.255.255
的地址,例如广播地址,因此请使用uint
。这不是真正的答案。为什么不将其作为对其中一个最重要的答案发表评论?您能解释一下吗?返回void,因此您不能对其调用ToArray()
(供将来的读者使用)。相反,为反转的字节分配一个值,然后您可以调用ToArray().是IEnumerable
的扩展方法。上述代码完全可以。此方法为某些IP生成负数(例如140.117.0.0)你需要使用uint,但这是这里最正确的答案。@Ruberduck:你只需要使用uint
如果你想将32位数据作为无符号数,int
可以保存相同的信息。如果你想将其存储在数据库中int
更合适,你需要bigint
来保存能够以无符号的形式存储它。uint在我看来是一种更好的表示形式。有符号的int需要一点符号,因此在范围的最顶端会丢失地址。是的,它可以保存相同的数据,但会输出为负数,如果在地址栏中键入它,这不是有效的IP。@ruberduck:以uint您也不能在地址栏中键入它,您首先必须将其转换为文本形式才能这样做。仅仅因为使用最简单的形式将int
转换为文本不会产生工作IP地址,这不是不使用它的好理由。@ruberduck:这不是uint
,这是的文本表示形式uint
。GetAddressBytes方法可能会以相反的顺序返回字节,这取决于机器是endian还是endian,因此正确的语句可能适用于某些机器:long m_Address=(地址[0]这实际上似乎对使用.NET的Windows没有什么影响-对Mono不太确定。请看@Jesse它恰好对您输入的1.1.1
没有影响,因为它的字节数组是回文的。尝试使用非回文的,如127.0.0.1
或192.168.1.1
。我看到了问题。重复的数字,如e> 1.1.1.1
,2.2.2
,123.123.123
总是会产生相同的结果。对于子孙后代,请参阅更新的fiddle:Like to note,我必须使用System.Net.IPAddress
来实现这一点。效果很好!@Jesse,这不仅适用于重复的数字,而且适用于所有的IP地址。因此2.1.1.2
将是最好的选择Am。把我看作最好的解决方案,但是我会改变1行,我会做字节[]字节= IP.MaToTIPv4](.GoADeStReBySee),这应该是一个注释,因为它不回答这个问题!这是最简单和优雅的解决方案,IHOO。C++可以把它放进C++代码中,因为这是OP请求的:
64*2^24 + 233*2^16 + 187*2^8 + 99
= 1089059683
using System;
using System.Net;
class App
{
static long ToInt(string addr)
{
// careful of sign extension: convert to uint first;
// unsigned NetworkToHostOrder ought to be provided.
return (long) (uint) IPAddress.NetworkToHostOrder(
(int) IPAddress.Parse(addr).Address);
}
static string ToAddr(long address)
{
return IPAddress.Parse(address.ToString()).ToString();
// This also works:
// return new IPAddress((uint) IPAddress.HostToNetworkOrder(
// (int) address)).ToString();
}
static void Main()
{
Console.WriteLine(ToInt("64.233.187.99"));
Console.WriteLine(ToAddr(1089059683));
}
}
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);
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct IPv4Address
{
public Byte A;
public Byte B;
public Byte C;
public Byte D;
}
// to actually cast it from or to an int32 I think you
// need to reverse the fields due to little endian
(64 = 0x40) << 24 == 0x40000000
(233 = 0xE9) << 16 == 0x00E90000
(187 = 0xBB) << 8 == 0x0000BB00
(99 = 0x63) == 0x00000063
---------- =|
0x40E9BB63
int ipToInt(int first, int second,
int third, int fourth)
{
return (first << 24) | (second << 16) | (third << 8) | (fourth);
}
public double IPAddressToNumber(string IPaddress)
{
int i;
string [] arrDec;
double num = 0;
if (IPaddress == "")
{
return 0;
}
else
{
arrDec = IPaddress.Split('.');
for(i = arrDec.Length - 1; i >= 0 ; i = i -1)
{
num += ((int.Parse(arrDec[i])%256) * Math.Pow(256 ,(3 - i )));
}
return num;
}
}
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();
}
private int IpToInt32(string ipAddress)
{
return BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes().Reverse().ToArray(), 0);
}
private string Int32ToIp(int ipAddress)
{
return new IPAddress(BitConverter.GetBytes(ipAddress).Reverse().ToArray()).ToString();
}
public static long ConvertIPToLong(string ipAddress)
{
System.Net.IPAddress ip;
if (System.Net.IPAddress.TryParse(ipAddress, out ip))
{
byte[] bytes = ip.GetAddressBytes();
return
16777216L * bytes[0] +
65536 * bytes[1] +
256 * bytes[2] +
bytes[3]
;
}
else
return 0;
}
static uint ToInt(string addr)
{
return BitConverter.ToUInt32(IPAddress.Parse(addr).GetAddressBytes(), 0);
}
static string ToAddr(uint address)
{
return new IPAddress(address).ToString();
}
public static uint ConvertFromIpAddressToInteger(string ipAddress)
{
var address = IPAddress.Parse(ipAddress);
byte[] bytes = address.GetAddressBytes();
// flip big-endian(network order) to little-endian
if (BitConverter.IsLittleEndian)
{
Array.Reverse(bytes);
}
return BitConverter.ToUInt32(bytes, 0);
}
public static string ConvertFromIntegerToIpAddress(uint ipAddress)
{
byte[] bytes = BitConverter.GetBytes(ipAddress);
// flip little-endian to big-endian(network order)
if (BitConverter.IsLittleEndian)
{
Array.Reverse(bytes);
}
return new IPAddress(bytes).ToString();
}
ConvertFromIpAddressToInteger("255.255.255.254"); // 4294967294
ConvertFromIntegerToIpAddress(4294967294); // 255.255.255.254
public uint GetIpAsUInt32(string ipString)
{
IPAddress address = IPAddress.Parse(ipString);
byte[] ipBytes = address.GetAddressBytes();
Array.Reverse(ipBytes);
return BitConverter.ToUInt32(ipBytes, 0);
}
public string GetIpAsString(uint ipVal)
{
byte[] ipBytes = BitConverter.GetBytes(ipVal);
Array.Reverse(ipBytes);
return new IPAddress(ipBytes).ToString();
}
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;
}
byte[] ip = address.Split('.').Select(s => Byte.Parse(s)).ToArray();
if (BitConverter.IsLittleEndian) {
Array.Reverse(ip);
}
int num = BitConverter.ToInt32(ip, 0);
byte[] ip = BitConverter.GetBytes(num);
if (BitConverter.IsLittleEndian) {
Array.Reverse(ip);
}
string address = String.Join(".", ip.Select(n => n.ToString()));
string IntToIp(int d)
{
int v1 = d & 0xff;
int v2 = (d >> 8) & 0xff;
int v3 = (d >> 16) & 0xff;
int v4 = (d >> 24);
return v4 + "." + v3 + "." + v2 + "." + v1;
}
public static Int32 getLongIPAddress(string ipAddress)
{
return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0));
}
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));
public static class IPAddressExtensions
{
/// <summary>
/// Converts IPv4 and IPv4 mapped to IPv6 addresses to an unsigned integer.
/// </summary>
/// <param name="address">The address to conver</param>
/// <returns>An unsigned integer that represents an IPv4 address.</returns>
public static uint ToUint(this IPAddress address)
{
if (address.AddressFamily == AddressFamily.InterNetwork || address.IsIPv4MappedToIPv6)
{
var bytes = address.GetAddressBytes();
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
return BitConverter.ToUInt32(bytes, 0);
}
throw new ArgumentOutOfRangeException("address", "Address must be IPv4 or IPv4 mapped to IPv6");
}
}
[TestClass]
public class IPAddressExtensionsTests
{
[TestMethod]
public void SimpleIp1()
{
var ip = IPAddress.Parse("0.0.0.15");
uint expected = GetExpected(0, 0, 0, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void SimpleIp2()
{
var ip = IPAddress.Parse("0.0.1.15");
uint expected = GetExpected(0, 0, 1, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void SimpleIpSix1()
{
var ip = IPAddress.Parse("0.0.0.15").MapToIPv6();
uint expected = GetExpected(0, 0, 0, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void SimpleIpSix2()
{
var ip = IPAddress.Parse("0.0.1.15").MapToIPv6();
uint expected = GetExpected(0, 0, 1, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void HighBits()
{
var ip = IPAddress.Parse("200.12.1.15").MapToIPv6();
uint expected = GetExpected(200, 12, 1, 15);
Assert.AreEqual(expected, ip.ToUint());
}
uint GetExpected(uint a, uint b, uint c, uint d)
{
return
(a * 256u * 256u * 256u) +
(b * 256u * 256u) +
(c * 256u) +
(d);
}
}
var ipAddress = "10.101.5.56";
var longAddress = long.Parse(string.Join("", ipAddress.Split('.').Select(x => x.PadLeft(3, '0'))));
Console.WriteLine(longAddress);
var address = IPAddress.Parse("10.0.11.174").GetAddressBytes();
long m_Address = ((address[3] << 24 | address[2] << 16 | address[1] << 8 | address[0]) & 0x0FFFFFFFF);