【问题标题】:C# - WinRT - Convert IPv6 address stored as a byte array to stringC# - WinRT - 将存储为字节数组的 IPv6 地址转换为字符串
【发布时间】:2014-02-27 06:17:37
【问题描述】:

我有一个以byte[16] 数组形式提供的 IPv6 地址,我想将其转换为 string(用于记录)。

我通常会在 C# 中使用 System.Net.IPAddress 构造函数来实现这一点,但似乎 System.Net.IPAddress 在 C# 中不适用于 WinRT/Windows 应用商店。有没有人有等效的方法来进行这种转换/格式化?

【问题讨论】:

  • 哦,我知道有很长的路要走(通过查找 IPAddress.ToString() 的 .NET 反射器代码并查看 MS 如何在内部处理)但我希望找到 C# 中已经内置的东西。

标签: c# windows-runtime ipv6


【解决方案1】:

将字节数组转换为有效的 IPv6 地址非常简单。

// Precondition: bytes.Length == 16
string ConvertToIPv6Address(byte[] bytes)
{
    var str = new StringBuilder();
    for (var i = 0; i < bytes.Length; i+=2)
    {
        var segment = (ushort)bytes[i] << 8 | bytes[i + 1];         
        str.AppendFormat("{0:X}", segment);
        if (i + 2 != bytes.Length)
        {
            str.Append(':');
        }           
    }

    return str.ToString();
}

折叠空白段有点复杂,但除了显示目的之外通常不需要。

【讨论】:

    【解决方案2】:

    我相信Windows.Networking.HostNameIPAddress 的替代品。

    编辑:但我不确定你是否可以从byte[] 创建一个。

    另见:

    【讨论】:

    • 谢谢,我还查看了 Windows.Networking.Hostname - 但我仍然不清楚如何获取这个字节数组并最终得到 IPv6 地址的字符串表示形式 :( 这是一个使用 System.Net.IPAddress 更容易
    【解决方案3】:

    我通过使用冒号分隔符一次创建两个字节的完整 IPv6 字符串手动解决了这个问题。然后,我将该字符串传递给 Windows.Networking.HostName 并访问它的 DisplayName 属性,它返回了压缩版本(即 0000 替换为 0 和单个 :: 替换(如果适用))。

    至少 HostName 为我节省了一些的工作:) 虽然没有完整的 IPAddress 替换仍然很遗憾:(

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2020-07-30
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多