gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:02:33 24 4
gpt4 key购买 nike

我昨天问了一个关于将 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 解析整数 string 时, 结果正确。


至于解决方案。

要么你这样解析你的IP地址(按字符串):

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# - long.Parse 和新的 IPAddress 行为,同时将十六进制值解析为 IPAddress C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26800243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com