| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1007 人关注过本帖
标题:VFP探讨之空值和可变长类型在DBF表文件中的存储(一):数的进制、相互转换以 ...
只看楼主 加入收藏
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
结帖率:100%
收藏
 问题点数:0 回复次数:7 
VFP探讨之空值和可变长类型在DBF表文件中的存储(一):数的进制、相互转换以及单位
    引言:FoxPro 9.0为了与其它数据库系统兼容,推出了一系列新的数据类型,比如:可变长类型。再加上之前已经有的一种特殊值—.NULL.,数据类型变得非常丰富。作为早已定下了结构的DBF表文件是如何跟踪和保存这些新的元素呢?本次就与各位感兴趣的狐友谈谈这个问题。

    首先,与各位谈一下数的进制,因为不搞懂进制,后面讲到主题的时候就会看不懂数据。
二进制:众所周知,计算机电路本身只懂两个数:0、1,所以在计算机中存储的任何数据都只是数字0和1,这种方法被称为二进制。二进制的英文名称是Binary,故通常在书写二进制时,在数值的后面加上一个大写字母“B”,以示其为一个二进制数。比如:110B。由于二进制数值是逢2进1,所以,一个不大的十进制数值用二进制表示就会很长。比如十进制数120,用二进制表示就是01111000B。鉴于此,位数更短的十六进制产生了。
十六进制:十六进制是逢16进1。其中,0~9的表示与十进制相同,10~15用英文字母A~F表示。十六进制的英文名称是Hexadecimal,故通常在书写十六进制时,在数值的后面加上一个大写字母“H”,以示其为一个十六进制数。比如:3A6H。上面提到的十进制数120,用十六进制表示就是78H,是不是明显比二进制的01111000B要短很多?在绝大多数查看底层数据的软件中,都用十六进制数值显示。这也是为什么要介绍它的原因。
    除了二进制、十六进制和我们日常使用的十进制以外,还有一种八进制表示方法。因其不常用,就不作介绍了。

    接着,来聊聊二进制、十进制、十六进制之间的相互转换。讲转换之前,先说一下位的高低和权重分配问题。与十进制相同,数的最右边是最低位,最左边是最高位。权重分配:以二进制为例,最右边一位是2的0次方,往左一位是2的1次方… …,最左边一位是2的(位数-1)次方;十六进制与此相仿:最右边一位是16的0次方… …,最左边一位是16的(位数-1)次方。出于方便理解的角度,就不介绍负数的补码存储形式了,下面的讨论都基于非负数。
二进制转十进制:将各位数值乘以相应位置的权重,然后将各位上的计算结果相加,就是最终的十进制数值。比如:10100011B转换成十进制数的过程是:1×2的7次方+0×2的6次方+1×2的5次方+0×2的4次方+0×2的3次方+0×2的2次方+1×2的1次方+1×2的0次方=128+0+32+0+0+0+2+1=163;
十进制转二进制:用短除法操作,每一步都除以2,将余数写在边上,直到最后的被除数为1。连同最后的被除数1一起,按所写余数的逆向拼合,得到最终的二进制数值。以十进制数值10为例(操作过程见下图),得到最后的二进制数值1010B。
图片附件: 游客没有浏览图片的权限,请 登录注册

二进制转十六进制:将二进制数值从右到左每四位分一段,分别以二进制转十进制的方式操作,将每段转换完成后拼合在一起,就是最终的十六进制。以11011B为例:第一步,分段:将其分为两段:0001 1011(红色的三个零可以不考虑);第二步,将每段分别转换成十进制:第一段转为十进制的值是1;第二段转为十进制的值是11,用十六进制表示就是B;第三步,拼合:将两段得出的值依次拼在一起,得到1B,这就是最终的十六进制值1BH;
十六进制转二进制:明白了二进制转十六进制的原理后,十六进制转二进制也就好做了。将十六进制数值的每一位都以十进制转二进制的方法转换成4位的二进制数(不足四位的在高位补足数字0)。比如A1CH:A=1010,1=0001(在高位补足数字0),C=1100,拼合起来就是101000011100B。
    至于十进制和十六进制之间的互转,可以参考十进制与二进制的互转,只是别忘了把除数或底数改为16。

    最后,说说数据存储的单位。数据存储的单位是以二进制为基础来命名的,常用的有:位(Bit)、字节(Byte)、字(Word)、双字(Double Word)、四字(Quatuor Word)。
1位=1个二进制位,数据范围只有0和1,通常用小写字母“b”来表示;
1字节=8个二进制位,非负数的范围在0~255,通常用大写字母“B”来表示。

    说到这里,顺便科普一下网络带宽和流量的知识。通常,运营商有线宽带会宣称带宽达到了20Mb、30Mb等等。注意:这里用的是小写字母“b”,即20兆位、30兆位。我们平时说的下载速度“每秒多少兆”是指多少兆字节,即大写字母“B”。两者相差7倍(也就是说前者是后者的8倍),在理想状态下,带宽20Mb是指每秒钟可下载的数据量是20÷8=2.5MB。实际上,受传输介质(光缆、网线等)、服务器端机器、客户端机器、传输距离、使用方式(共享、独享)等诸多因素的影响,下载速度在顺畅的情况下,基本维持在1.1~1.8MB/秒的水平。移动设备的2G/3G/4G流量也是同理,运营商宣称的所谓流量带宽100Mb其实是指100兆位,而数据交换的单位是字节。还有,流量由于用的是基站设备,肯定是共享带宽方式,在用户密集区,传输速度一定会大幅度下降。
    扯远了,拉回来,继续说剩下的几个单位概念:
1个字=2字节=16个二进制位,非负数的范围在0~65535;
1个双字=4个字节=32个二进制位,非负数的范围在0~4294967295;
1个四字=8个字节=64个二进制位,这也是FoxPro能直接处理的数值的最多位数了。


[ 本帖最后由 taifu945 于 2014-3-26 13:29 编辑 ]
收到的鲜花
  • sdta2014-03-26 13:19 送鲜花  20朵   附言:好文章
  • tlliqi2014-03-26 13:47 送鲜花  20朵   附言:加分
搜索更多相关主题的帖子: 数据库系统 英文名称 计算机 二进制 主题 
2014-03-26 13:08
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
不错,继续。感兴趣。
到底是老师出身,文笔也不错。

坚守VFP最后的阵地
2014-03-26 13:18
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sdta在2014-3-26 13:18:59的发言:

不错,继续。感兴趣。
到底是老师出身,文笔也不错。
谢谢S版。
2014-03-26 13:26
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
二进制的1010与101转换为十进制的结果为什么都是10

坚守VFP最后的阵地
2014-03-26 13:59
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sdta在2014-3-26 13:59:07的发言:

二进制的1010与101转换为十进制的结果为什么都是10
101B等于十进制数的5呀。
2014-03-26 14:06
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
以下是引用taifu945在2014-3-26 14:06:34的发言:

101B等于十进制数的5呀。

二进制:101
1*2^3+0*2^2+1*2^1

坚守VFP最后的阵地
2014-03-26 14:51
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sdta在2014-3-26 14:51:08的发言:

 
二进制:101
1*2^3+0*2^2+1*2^1

最右边从2^0开始,1*2^2+0*2^1+1*2^0=4+0+1=5。
2014-03-26 14:59
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
N位的数据*2^(位数-1)+......+
是这样吧

坚守VFP最后的阵地
2014-03-26 15:43
快速回复:VFP探讨之空值和可变长类型在DBF表文件中的存储(一):数的进制、相互转 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016814 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved