首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >long.Parse和解析十六进制值到IPAddress C#时的新IPAddress行为

long.Parse和解析十六进制值到IPAddress C#时的新IPAddress行为
EN

Stack Overflow用户
提问于 2014-11-07 11:29:14
回答 3查看 1.1K关注 0票数 2

昨天我问了一个关于将HEX字符串转换成IP的问题,并在这里得到了答案:C#将十六进制转换为ip

问题是,当我使用这个函数时

代码语言:javascript
复制
var ip = new IPAddress(long.Parse(ipString, NumberStyles.AllowHexSpecifier));

它确实返回一个有效的IPAddress,但以相反的方式执行。例如:

六角弦:

代码语言:javascript
复制
c0a8000a

它应被分析为:

代码语言:javascript
复制
192.168.0.10

函数返回long.Parse()函数。

代码语言:javascript
复制
3232235530

但是在调用IPAddress构造函数之后,我的IP是

代码语言:javascript
复制
10.0.168.192 

而不是正确的那个。像Converter.aspx这样的在线工具运行得很好。它是小的还是大大小小的?我是要自己翻转绳子呢,还是有更简单的答案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-07 12:05:02

所以一项小小的研究产生了结果,你猜对了。这和执着有关。

构造函数:IPAddress(长newAddress)期望值在网络字节顺序中,后者被定义为大端。

我假设您的系统架构很少使用endian(和大多数英特尔系统一样)。

.NET使用底层系统的特性,所以当您在这样的系统上解析long时,它就存储得很少。

这就是为什么当您通过解析整数字符串时,结果是正确的。

至于解决办法。

接下来,您将您的IPAddress解析为这样(按字符串):

代码语言:javascript
复制
IPAddress ip = IPAddress.Parse(uint.Parse(ipString, NumberStyles.AllowHexSpecifier).ToString());

或者,为了更“正确”,您可以检查BitConverter.IsLittleEndian字段并翻转字节顺序(如果是nescessery):

代码语言:javascript
复制
    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;
    }
票数 3
EN

Stack Overflow用户

发布于 2014-11-07 12:05:44

默认情况下,数字(在您的例子中是长的)存储在x86体系结构内存中的小Endian格式中,这就是为什么将IP地址倒置的原因。您可以在BitConverter.IsLittleEndian字段的帮助下检查这一点。一个简单的解决方案是反转输入字符串的字节顺序,然后将反转的字符串解析为long,如下所示:

代码语言:javascript
复制
string ipString = "c0a8000a";

// Reverse the HEX string byte order
int length = ipString.Length;
char[] reversedChars = new char[length];
for (int i = 0; i < length; i += 2)
{
    reversedChars[i] = ipString[length - i - 2];
    reversedChars[i + 1] = ipString[length - i - 1];
}

string reversedString = new string(reversedChars);

// Parse the reversed byte string
long parsedValue = long.Parse(reversedString, NumberStyles.AllowHexSpecifier);
IPAddress ip = new IPAddress(parsedValue);
票数 0
EN

Stack Overflow用户

发布于 2014-11-07 12:14:48

正如已经指出的,问题是您必须从主机字节顺序(litte )转换为网络字节顺序(大端字节)。您可以使用IPAddress.HostToNetworkOrder方法来完成以下操作:

代码语言:javascript
复制
var ip = new IPAddress(
  IPAddress.HostToNetworkOrder(
    int.Parse(ipString, NumberStyles.AllowHexSpecifier)
  )
);

注意,您需要使用int.Parse而不是long.Parse来工作,因为在IPv4地址中是32位,而不是64位。

此方法不涉及字符串转换或使用其他类(如BitConverter )来执行转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26800243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档