c# - 将十六进制值解析为 IPAddress C# 时的 long.Parse 和新 IPAddress 行为

标签 c# parsing ip-address

我昨天问了一个关于将 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/

相关文章:

c# - 允许本地管理员运行应用程序而无需 "Run as Administrator"

c# - DateTime.TryParseExact 不稳定的结果

c# - ASP.NET OpenXML : How to create password protected word file

c++ - 将结构 vector 保存到制表符分隔的文本文件中

java - 如何将 string = "\t"转换为 char

binding - SSL 主机头 ip 的服务器绑定(bind)设置为 255.255.255.255

c# - 父窗体的移动事件

java - 如何在字符串中查找 int 值

c++ - Boost Asio 始终返回 0.0.0.0 IP

ip-address - 获取带有国家/地区代码的文化信息