源码pub:C#实现IPv6地址的二进制输出
在msdn中文论坛上,遇到的一个问题,应楼主需求写了相关代码,没多大技术含量,高手飘过吧。
下载本文相关示例:
https://files.cnblogs.com/Jason_z/Ipv6ConvertTest.rar
如果你对IPv6地址的语法格式还不是很够熟悉,建议阅读:http://375362she.blog.51cto.com/365362/73629
楼主给出的IPv6地址 是:fe80::c960:55bf:bb18:611c ,熟悉IPv6的朋友知道,这是一个采用了压缩零形式的IPv6地址,
这使问题变得有些麻烦,不过所幸的是IPv6里只允许您使用一次零压缩,要确定“::”代表多少位零,您可以计算压缩地址中的块数,用 8 减去此数就可以了。另外一个问题就是数值类型的转换,我们获取的Ipv6地址应该是类似上面的十六进制形式,要转化为二进制的形式,就应该先将十六进制转化为十进制,再将十进制转化为二进制:
PS:其他进制转化如下
//十进制转二进制
Console.WriteLine(Convert.ToString(69, 2));
//十进制转八进制
Console.WriteLine(Convert.ToString(69, 8));
//十进制转十六进制
Console.WriteLine(Convert.ToString(69, 16));
//二进制转十进制
Console.WriteLine(Convert.ToInt32(”100111101″, 2));
//八进制转十进制
Console.WriteLine(Convert.ToInt32(”76″, 8));
//十六进制转十进制
Console.WriteLine(Convert.ToInt32(”FF”, 16));
还是公布源码吧:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Ipv6ConvertTest
{
class Program
{
static void Main(string[] args)
{
string str = "fe80::c960:55bf:bb18:611c";
string[] str1 = Regex.Split(str, @"[:]+");
//IP地址没有采用压缩零的形式
if (str1.Length == 8)
{
for (var i = 0; i < str1.Length; i++)
{
Console.Write(Convert.ToString(Convert.ToUInt32(str1[i], 16), 2));
if (i != str1.Length - 1)
{
Console.Write(":");
}
}
}
//IP地址采用压缩零的形式
else
{
//不采用压缩零的形式输出
for (var j = 0; j < str1.Length; j++)
{
str = str.Replace(str1[j], Convert.ToString(Convert.ToUInt32(str1[j], 16), 2));
}
Console.WriteLine(str);
/*不采用压缩零的形式输出
* int m = 8 - str1.Length;//计算压缩零的个数
* string tmp1 = "";//存储压缩零字符串
* for (var k = 0; k < m; k++)
* {
* tmp1 += "0:";
* }
* for (var j = 0; j < str1.Length; j++)
* {
str = str.Replace(str1[j], Convert.ToString(Convert.ToUInt32(str1[j], 16), 2));
* }
* str=str.replace("::",":"+tmp1);
* Console.WriteLine(str);
*/
}
Console.ReadKey();
}
}
}
作者:Jason_z(开发者的网上家园 - 博客园)
出处:http://www.cnblogs.com/Jason_z/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。