我昨天问了一个关于将 HEX 字符串转换为 IP 的问题,并在这里得到了答案:C# convert hex into ip
问题是,当我使用该函数时
var ip = new IPAddress(long.Parse(ipString, NumberStyles.AllowHexSpecifier));
它确实返回一个有效的 IP 地址,但以相反的方式返回。例如:
十六进制字符串:
c0a8000a
它应该被解析为:
192.168.0.10
long.Parse()函数返回
3232235530
但是调用IPAddress构造函数后我的IP是
10.0.168.192
而不是正确的。在线工具,例如 http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx工作正常。它是小端还是大端?我必须自己翻转字符串还是有更简单的答案?
最佳答案
因此进行了一些研究,您猜对了。它与字节序有关。
构造函数:IPAddress(long newAddress)预计该值位于 network byte order 中它被定义为big-endian。
我假设您的系统架构使用little-endian(就像大多数英特尔系统一样)
.NET
使用底层系统的字节序,因此当您在此类系统上解析 long
时,它会以小字节序存储。
这就是为什么当您通过 IPAddress.Parse
解析整数字符串时,结果正确。
至于解决方案。
您是否这样解析您的 IPAddress(通过字符串):
IPAddress ip = IPAddress.Parse(uint.Parse(ipString, NumberStyles.AllowHexSpecifier).ToString());
或者为了更“正确”,您可以检查 BitConverter.IsLittleEndian
字段并在必要时翻转字节顺序:
static IPAddress ParseHexIPAddress(String szIPAddress) {
uint uiIP = uint.Parse(szIPAddress, System.Globalization.NumberStyles.AllowHexSpecifier);
IPAddress ip = null;
if (BitConverter.IsLittleEndian) {
uint uiIPRev = BitConverter.ToUInt32(BitConverter.GetBytes(uiIP).Reverse().ToArray(), 0);
ip = new IPAddress(uiIPRev);
} else {
ip = new IPAddress(uiIP);
}
return ip;
}
关于c# - 将十六进制值解析为 IPAddress C# 时的 long.Parse 和新 IPAddress 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26800243/