将IP转换成长整型的原理是什么?

lkf181 2013-02-13 01:51:26
 我得到一个根据IP地址,确定地理位置的源码,里面有 一个方法 是将IP转换成长整型 算法中涉及到了 位移操作,不太理解为什么 这样做 即  Ipv += Ipi << (3 - i) * 8; 这句话 不太理解 代码如下:


        // IP字符串->长整型值
        public static uint IpStringToInt(string IpString)
        {
            uint Ipv = 0;
            string[] IpStringArray = IpString.Split('.');
            int i;
            uint Ipi;
            for (i = 0; i < 4 && i < IpStringArray.Length; i++)
            {
                if (IsNumeric(IpStringArray[i]))
                {
                    Ipi = (uint)Math.Abs(Convert.ToInt32(IpStringArray[i]));
                    if (Ipi > 255) Ipi = 255;
                    Ipv += Ipi << (3 - i) * 8;
                }
            }
            return Ipv;
        }
 
        // 字符串数值型判断
        public static bool IsNumeric(string s)
        {
            if (s != null && System.Text.RegularExpressions.Regex.IsMatch(s, @"^-?\d+$"))
                return true;
            else
                return false;
        }
...全文
2427 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2013-02-20
  • 打赏
  • 举报
回复
引用 10 楼 MOTA 的回复:
引用 6 楼 caozhy 的回复:在10进制计算中,移位表示x10和/10。比如 30右移1位,3,就是/10 30左移1位,300,就是x10。 (这个小学生都会吧)。 那么二进制一个道理,左移就是x2,左移n位就是x2^n,右移就是/2。 给你一个思考题:十六进制 0x3A 是 0x3A0 的多少倍?不要化为10进制脱口说出来。 虽然你说的貌似很……
原来你的意思是你觉得10进制书写的数字用移位运算符应该x10或者/10啊?我的天。
skylkj 2013-02-20
  • 打赏
  • 举报
回复
引用 10 楼 MOTA 的回复:
虽然你说的貌似很有道理 但是我测试了一下 在C#里 移位均是 前面的数字乘以后面的2^数字 不知道为什么.....
比如二进制数101,左移一位就变成1010,右移一位就是10, 就是个2倍的关系。 (十进制移一位就是10倍的关系,十六进制就是16倍的关系,但计算机程序只认二进制,就算你写 255<<1 ,计算机也是把255当成二进制的1111 1111,所以255 << 1 的结果就是 1 1111 1110) 做过嵌入式的都比较清楚位移的概念,比如你要写x *= 4,好的嵌入式程序员会写 x <<= 2,因为位移操作比乘法操作高效的多,而结果却完全相同
threenewbee 2013-02-19
  • 打赏
  • 举报
回复
引用 10 楼 MOTA 的回复:
引用 6 楼 caozhy 的回复: 在10进制计算中,移位表示x10和/10。比如 30右移1位,3,就是/10 30左移1位,300,就是x10。 (这个小学生都会吧)。 那么二进制一个道理,左移就是x2,左移n位就是x2^n,右移就是/2。 给你一个思考题:十六进制 0x3A 是 0x3A0 的多少倍?不要化为10进制脱口说出来。 虽然你说的貌似很有道理 但是我测试了……
你想说什么?
MOTA 2013-02-19
  • 打赏
  • 举报
回复
查询手册发现 int operator <<(int x, int count); uint operator <<(uint x, int count); long operator <<(long x, int count); ulong operator <<(ulong x, int count); C#移位只有以上预定义的移位运算符
MOTA 2013-02-19
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
在10进制计算中,移位表示x10和/10。比如 30右移1位,3,就是/10 30左移1位,300,就是x10。 (这个小学生都会吧)。 那么二进制一个道理,左移就是x2,左移n位就是x2^n,右移就是/2。 给你一个思考题:十六进制 0x3A 是 0x3A0 的多少倍?不要化为10进制脱口说出来。
虽然你说的貌似很有道理 但是我测试了一下 在C#里 移位均是 前面的数字乘以后面的2^数字 不知道为什么.....
shine333 2013-02-17
  • 打赏
  • 举报
回复
引用 7 楼 heshunneng 的回复:
移位看着蛋疼啊 .net的话 直接调方法就OK了
还是位运算吧,否则,你可能一辈子搞不清楚子网掩码的工作原理
mickers 2013-02-17
  • 打赏
  • 举报
回复
额,发现移位动的应用
heshunneng 2013-02-17
  • 打赏
  • 举报
回复
移位看着蛋疼啊 .net的话 直接调方法就OK了
threenewbee 2013-02-13
  • 打赏
  • 举报
回复
在10进制计算中,移位表示x10和/10。比如 30右移1位,3,就是/10 30左移1位,300,就是x10。 (这个小学生都会吧)。 那么二进制一个道理,左移就是x2,左移n位就是x2^n,右移就是/2。 给你一个思考题:十六进制 0x3A 是 0x3A0 的多少倍?不要化为10进制脱口说出来。
threenewbee 2013-02-13
  • 打赏
  • 举报
回复
ip转化成一个32bit uint 方法是每个小节代表16进制2位,或者1个字节。一共是4字节,4x8bit=32bit。 a.b.c.d分别是a*2^24+b*2^16+c*2^8+d。
  • 打赏
  • 举报
回复
引用 楼主 lkf181 的回复:
for (i = 0; i < 4 && i < IpStringArray.Length; i++) { if (IsNumeric(IpStringArray[i])) { Ipi = (uint)Math.Abs(Convert.ToInt32(IpStringArray[i])); if (Ipi > 255) Ipi = 255; Ipv += Ipi << (3 - i) * 8; } }
这简单的几句话其“一目了然的bug”也是多的令人发指。例如 1bd.172.1.8a 192.168.1.256 -1.168.1.200 诸如此类的都是ip? 唉!
  • 打赏
  • 举报
回复
引用 楼主 lkf181 的回复:
public static bool IsNumeric(string s) { if (s != null && System.Text.RegularExpressions.Regex.IsMatch(s, @"^-?\d+$")) return true; else return false; }
这个代码晕死个人!判断一个字符串是不是byte,应该使用byte.TryParse,使用又大又慢的正则是搞什么呢?
stonespace 2013-02-13
  • 打赏
  • 举报
回复
ipv4是四个字节的数据,只是把四个字节拼成一个32位整数而已,
wanghui0380 2013-02-13
  • 打赏
  • 举报
回复
额,基础问题。 传统ipv4地址,就是256进制数。 你明白这个自然就知道这个右移是啥意思了 如果你实在想不明白就看下面的代码
public static long ConvertIPToLong(string ipAddress)
{
	System.Net.IPAddress ip;

	if (System.Net.IPAddress.TryParse(ipAddress, out ip))
	{
		byte[] bytes = ip.GetAddressBytes();

		return (long)(((long)bytes[0] << 24) | (bytes[1] << 16) |
			(bytes[2] << 8) | bytes[3]);
	}
	else
		return 0;
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧