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 编辑 ]