先来研究NUMBER类型的数字回推算法
类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,......,数字20]
1、长度类型没什么号说的
2、符号位,这个需要说一下
The sign bit, which is the high order bit (128)
按照文档的说法这个判断方法是和128进行最高位按位与出来的,如果
这位小于128则是负数,我们使用127试试吧
128的二进制为1000 0000
127的二进制为0111 1111
最高位1&0=0 则代表他是负数,
如果是129则是正数
128的二进制为1000 0000
129的二进制为1000 0001
最高位1&1=1 则代表他是正数,
3、指数位
正数
128固定为正负数的判断
65固定 The offset, which is always 65
那么就是128+65=193就是正数指数的固定数值
负数
固定为62为负数的固定数值
4、数字位
正数
那我们来判断这样一个数字
193,64,13,31
那么就是
193-193=0
(64-1)*100^(0-0) =63
(13-1)*100^(0-1) =0.12
(31-1)*100^(0-2) =0.0030
为63.123
负数
62,38,89,71,102
62-62=0
101-38 = 63 *100^(0-0)=63
101-89 = 12 *100^(0-1)=0.12
101-71 = 30 *100^(0-2)=0.003
102 为排序位不用理会
所以为-63.123
研究了数字的算法接下来我们使用C语言进行实现
考虑实际的16进制格式
4,c1,40,d,1f 63.123
5,3e,26,59,47,66 -63.123
04,c1,40,0d,1f,05,3e,26,59,47,66
早期我写过一个C语言程序使用位域来完成,因为有点久远了我也不太记得是否验证过不过先放到这里
点击(此处)折叠或打开
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- double number(int sseek)
- {
- struct bin1b
- {
- unsigned a1:1;
- unsigned a2:1;
- unsigned a3:1;
- unsigned a4:1;
- unsigned a5:1;
- unsigned a6:1;
- unsigned a7:1;
- unsigned a8:1;
- };
- int sseek=8182;//设置偏移量后期可以直接推算出来
- int clg,digt,i;
- double a=0.0;
- char clgc;
- char *Ptr;
- int *Ptrn;
- struct bin1b *data;
- FILE *fp;
- fp=fopen("D:\\c\\95393.dbf","rb");
- if(!fp)
- {
- printf("can't open this file!");
- }
- else
- {
- fseek(fp,sseek+1,0);
- fread(&clgc,1,1,fp);
- printf("%d\n",ftell(fp));
- clg=clgc;
- Ptr=(char *)malloc(clg); //分配字段长度的一个4个单字节内存空间
- Ptrn=(int *)malloc(sizeof(int)*clg);
- fread(Ptr,1,clg,fp);
- printf("%d\n",ftell(fp));
- for(i=0;i<clg;i++)
- {
- data=&Ptr[i];
- Ptrn[i]=data->a1+data->a2*2+data->a3*pow(2,2)+data->a4*pow(2,3)+data->a5*pow(2,4)+data->a6*pow(2,5)+data->a7*pow(2,6)+data->a8*pow(2,7);
- printf("%d\n",Ptrn[i]);
- }
- for(i=0;i<clg;i++)
- {
- if(Ptrn[0]<128)
- {
- digt=62-Ptrn[0];
- if((i>0) && (Ptrn[i]!=102))
- {
- a=a+(101-Ptrn[i])*pow(100,(digt-(i-1)));
- }
- }
- if(Ptrn[0]>128)
- {
- digt=Ptrn[0]-193;
- if(i>0 )
- {
- a=a+(Ptrn[i]-1)*pow(100,(digt-(i-1)));
- }
- }
- }
- if(Ptrn[0]<128)
- {
- a=-a;
- }
- else
- {
- a=a;
- }
- return(a);
- free(Ptr);
- free(Ptrn);
- }
- fclose(fp);
- }