领悟二进制和IP地址的关系
字: 1个字16位,其位编号为 b15~~b0。
1个字占用2个存府单元。
双字: 1个双字32位,其位编号为 b31~~b0。
1个双字占用4个存储单元。
四字: 1个四字64位,其位编号为 b63~~b0。
1个四字占用8个存储单元。
经常见到的存取信息的基本单位,英文为:Byte,就是“字节”。
一个字节由8位二进制数组成,其位编号自左至右为 b7~~b0。
(即,1个字节占用1个存储单元)
计算机中存储信息的基本单位是1个二进制位,简称:位,英文 bit,可用小写字母 b 表示,一位可存储一位二进制数。
(以上内容约为书上介绍基本概念)
(这概念有用吗?在汇编里非常有用,几乎全是这样的数据类型)
(在计算机“看来”,一切数据都是二进制信息)
(那些常用的 Windows 记事本 里看到的文本或是中文信息,那是为了给我们方便阅读,能够看得懂)
(而在计算机中,我们常称之为“文本文件”的内容,其实在计算机里都是二进制信息)
(只不过调出来为了让我们看得懂,才通过一系列“转化”和一系统“概念”,才从二进制“翻译”成我们看得明白的内容)
32位有多长?经常听到有人说:“IP地址是32位的二进制地址”。
不过,上面的定义只是网络书上或是经常有人提及的一个概念:……32位的二进制地址。
那么这个概念能不能给它“实例”化呢?
(注:以下只是个人分析,不保证个人理解和个人所说的是正确的)
例: 127.0.0.1
二进制表示这个地址: (要用 Windows Calc 计算器了,手工计算要疯掉!)
1111111.0.0.1 (二进制表示 127.0.0.1 IP地址)
但,它并不是32位的,所以左边要被位,让它为4个8位为一组。
就象是: 128,而我给128的左边加0,变成了: 00000128,那么它也是128 ~:)
01111111.00000000.00000000.00000001 (这才是32位的二进制地址的初步表示)
那么真实的32位IP地址:127.0.0.1 在计算机看来应该如何表示呢?
01111111000000000000000000000001
是上面这个样子,这才是真正的32位的二进制IP地址的书写。
在计算机看来,一切都是二进制信息,所以那个分隔的“点”就没有了~:)
为什么IP地址中间要有点儿?通过以上分析得出结论:那是为了让我们能够看懂和能够方便记忆,所以加上去的--人性化。
计算机可看不懂,它就认纯粹的二进制信息~:)
对了,现在想起了有的人(看操作象是高手的方式),有的人为了隐藏IP地址,它将IP地址“缩为”一串儿看上去很奇怪的数字。
这是为什么?
如:你会看到一些 http://2130706433
或是 Ping 2130706433
或是 Ftp …………
那就让我来揭穿,或者说从底层二进制来弄明白这个数字、这种表示方法到底是什么:)
下面是我们刚才计算出来的32位的二进制的IP地址表示:
01111111000000000000000000000001
这么长,哈哈……(该不会有人问那么"Redtek"我的名字是不是也可以用二进制表示?当然能,只是到时候我都不认识自己了:)
好,最简单的办法就是将上面的32位二进制地址计算成10进制就行了,让windows的计算器算吧~:)
打开 Windows 的计算器,选择“科学型”计算方式,在二进制那里COPY上面地址,然后点“十进制”就转出来了:)
转成十进制的地址信息如下:
2130706433
上面就是10进制的IP地址信息了,我们怎么验证它呢?
Ping 它啊~~
C:\TEMP\debug>ping 2130706433
Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% los
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
看到了,只要一Ping 它,Ping 就自动转化为我们看得懂的地址信息了。
所以, Http://2130706433 当然也能~:)
而且,当你这样操作了,你就会看到浏览器的提示栏里显示“……127.0.0.1……” ~:)
等等……你想到了什么?
这是我在写另一个网志的时候想到的……“喂……你们的网址是多秒?” ……太长了……我记不住,英文字母发音也不准……
如果你将你公司的HTTP首地址写成上面的10进制地址,是不是读给客户听更方便更好记忆呢?
是不是你用手机或是移动设备浏览被你“编码”10进制的地址信息输入更方便呢?谁让手机输入数字比输入字母快~:)
(注:无独立IP的主机无效)
以上就是个人总结的关于二进制与计算机中我们常说的IP地址的关系:)
10:04 2006-12-11
另:既然我们上面聊到了 Ping ,那么 Ping 还可以干什么呢?
Ping 可以看懂10进制地址信息,那么我们让 Ping 来做翻译吧~:)
我们知道: 字母 A 的16进制是 41 ,它的10进制是 65
set /a 0x41 也可以帮我们计算出 0X41 这个16进制的10进制是 65
所以,这回我们急了!!!我们要PING 0x41
C:\TEMP\debug>ping 0.0.0.0x41
Pinging 0.0.0.65 with 32 bytes of data:
Ping 帮我们把 0x41 转成了10进制数: 65,哈哈……
Ping 也可以当计算器~:)
上面的原理还是来自于二进制信息与什么是32位的二进制IP地址的我们刚才的讨论~:)
但Redtek本人不表示上面所说就一定是正确的,很可能等汇编语言完全学完以后上面的个人认为又是一种错误~:)
(另:为什么IP地址如: 127.0.0.1 这个子网的范围为什么是:0~~255呢?)
( 这是谁规定的? 为什么要这样规定? )
( 好象没人告诉我,好象就是指定这个范围 )
好,我们把这个弄清楚了~:)
IP地址是由32位的二进制地址组成。
由上面推断证明,它是每8位一组,一共四组,每组用 “点” 来隔开,为了让我们看明白:)
01111111.00000000.00000000.00000001
上面就是四组,每组8位二进制表示的IP地址。
8个位的二进制位等于一个字节的长度,
8个位的二进制数可以最大表示(10进制无符号数): 0~~255
所以,简单认为如果有一个10进制是256,那么它就超过了8位二进制所容纳的范围了(无符号数--即没有正负之分)。
255的16进制是FF。
当我们在8位寄存器中,用Debug做如下实验:
C:\TEMP\debug>debug
-a
0AF5:0100 MOV AL,100
^ Error
0AF5:0100 MOV AL,FF
把 100H (10进制的256)送入 8位的AL寄存器,结果溢出。
把 FFH (10进制的255)送入 8位的AL寄存器,刚好:)
FFH (10进制的255)转成二进制是: 11111111 (正好占8个二进制位)
100H(10进制的256)转成二进制是:100000000 (占9个二进制位,8位寄存器可放不下)
所以,取值这是样规定了从0~~255的范围刚好合适。
那么 255.255.255.255 是多大呢?
二进制表示: 11111111111111111111111111111111
它的十进制: 4294967295
相当于: 42亿多台主机……(不过这是理论值)
那么,经常遇到什么什么溢出也是这个原因~:)
Last edited by redtek on 2006-12-11 at 11:00 AM ]