c#中将IP地址转换成无符号整型数uint的方法与逆变换方法

我们知道 IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。

按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。
而c#中int32的数就是四个字节的,但是符号要占掉一位所以就不够了,但是无符号的 UInt32 就没有这样的问题。

所以理论上讲:UInt32是可以完整保存一个IP地址的。那下面的两个方法就是对IP与UInt32之间的互转换。

-----------------------

谢谢二楼的热心指正。 

 

2015-07-30 update

方法二、使用物理布局结果进行转换

using System;
using System.Net;
using System.Runtime.InteropServices;

namespace NET
{
    internal static class StructIpUtil
    {
        [StructLayout(LayoutKind.Explicit)]
        private struct IPV4
        {
            [FieldOffset(3)]
            public Byte IP0;
            [FieldOffset(2)]
            public Byte IP1;
            [FieldOffset(1)]
            public Byte IP2;
            [FieldOffset(0)]
            public Byte IP3;

            [FieldOffset(0)]
            public UInt32 IP;
        }

        internal static UInt32 ip2int(String ip)
        {
            Byte[] bytes = IPAddress.Parse(ip).GetAddressBytes();

            IPV4 uip = new IPV4()
            {
                IP0 = bytes[0],
                IP1 = bytes[1],
                IP2 = bytes[2],
                IP3 = bytes[3]
            };
            return uip.IP;
        }

    }
}

 

 

         public   static   string  Int2IP(UInt32 ipCode) {
            
byte  a  =  ( byte )((ipCode  &   0xFF000000 >>   0x18 );//24
            
byte  b  =  ( byte )((ipCode  &   0x00FF0000 >>   0x10 );//16
            
byte  c  =  ( byte )((ipCode  &   0x0000FF00 >>   0x8 );//8
            
byte  d  =  ( byte )(ipCode  &   0x000000FF );
            
string  ipStr  =  String.Format( " {0}.{1}.{2}.{3} " , a, b, c, d);
            
return  ipStr;
        }

        
public   static  UInt32 IP2Int( string  ipStr) {
            
string [] ip  =  ipStr.Split( ' . ' );
            
uint  ipCode  =   0xFFFFFF00   |   byte .Parse(ip[ 3 ]);
            ipCode 
=  ipCode  &   0xFFFF00FF   |  ( uint .Parse(ip[ 2 ])  <<   0x8 );
            ipCode 
=  ipCode  &   0xFF00FFFF   |  ( uint .Parse(ip[ 1 ])  <<   0x10 );
            ipCode 
=  ipCode  &   0x00FFFFFF   |  ( uint .Parse(ip[ 0 ])  <<   0x18 );
            
return  ipCode;
        }

 

 

 

转载于:https://www.cnblogs.com/vinstudio/archive/2010/01/24/1655288.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值