回 帖 发 新 帖 刷新版面

主题:关于FPT文件读取问题?

在VFP9帮助中看到FPT文件保存结构如下:
   备注头记录
偏移字节 说明 
00 – 03 下一个自由块的位置1 (首先存储高位字节的整数)
04 – 05 未使用 
06 – 07 块大小(每块的字节数)1 
08 – 511 未使用 

   备注块头和备注文本
偏移字节 说明 
00 – 03 块签名1 (表示块中数据的类型):(首先存储高位字节的整数)
         0 – 图片(图片字段类型)
         1 – 文本(备注型字段类型) 
04 – 07 备注长度 1 (以字节为单位) 
08 – n 备注文本(n = 长度)

问题:
  1、想知道如何取得以上各字符区域代表的值(如00 - 03中,如何取得下一个自由块的位置),我用以下代码只能取得字符型,但不知道如何转换成我想要的十进制数值数据.
     cFileFPT=GETFILE("FPT")
     cFileStr=FILETOSTR(cFileFPT)
     SUBSTR(cFileStr,1,4)&&这是代表下一个自由块的位置,但如何显示其真实数据值?
  2、备注文本(n = 长度)是什么意思,是指当前一条记录字段数据的长度,还是实际保存(比如字段是通用型)的图片文件大小?
以上两个问题,关键的是第一个问题,还请各位网友、老师细细讲解一下。
顺便讲一下什么是"首先存储高位字节的整数"?

回复列表 (共5个回复)

沙发

1、用 FOPEN() 打开 FPT 文件得到“句柄”用 FSEEK()定位偏移字节,再用 FREAD()读取数据。
2、在文件的文件头中,数据长度的16进制参数一般都为低位在前高位在后排列的。比如 DBF文件头的偏移字节04–07为总记录条数,如果有500条记录(16进制就是1F4 也就是01 F4)那么低位在前高位在后排列就是 F4 01, 因此偏移字节04就是F4 05就是01 06就是00 07就是 00 ,明白了吗?
3、给个16转10进制的例程你,希望对你有用!
另:我几年前曾用上述方法编制了DBF文件损坏修复和FPT文件中的图片和文本文件的取出。

******************************************
*  16进制转换为10进制                    * 
*  传入16进制数可以为数值型也可以字符型  * 
*  传出10进制数                          * 
* ****************************************

function   hex2dec 
lpara   X     
  
  local   nX,nNum,nPnum   
  nX=X   
  nNum=0   
  iii=1 
    
  if   vartype(nX)="N"   
       nX=alltrim(str(nX))   
  endif   
i= len(nX)   
do while .t.
    
  nPnum=substr(nX,i,1)   
    
  do case     
     case   upper(nPnum)="A"   
       nPnum=10   
     case   upper(nPnum)="B"     
       nPnum=11   
     case   upper(nPnum)="C"   
       nPnum=12   
     case   upper(nPnum)="D"   
       nPnum=13   
     case   upper(nPnum)="E"   
       nPnum=14   
     case   upper(nPnum)="F"   
       nPnum=15   
     otherwise   
       nPnum=val(nPnum)   
  endcase   
  if i< len(nX)
     ii=iii
     do while ii>0 
        nPnum=16*(nPnum)
        ii=ii-1
     enddo
     iii=iii+1
     nNum=nNum+nPnum      
  else
     nNum=nPnum
  endif
  i=i-1
  if i=0
     exit
  endif
enddo
   

return   nNum   
    
endfunc   
 
*************************************

板凳

[em12]
我也试着编写了一段程序,输入十六进制的字符串,返回十进制数值,大家交流下。
&&  hex2dec.prg &&

lpara hex_c
private hex_c,n001,dec001
hex_c=allt(hex_c)
dec001=0
for n001=1 to len(hex_c)
    dec001=dec001*16+h2d001(substr(hex_c,n001,1))
endfor
retu dec001

function h2d001
lpara h001
private h001,d001
d001=asc(upper(h001))
do case
case between(d001,48,57)
   retu d001-48
case between(d001,65,70)
   retu d001-55
endcase

&&   end     &&

调用
?hex2dec('11')
得出17
?hex2dec('AA')
得出170
?hex2dec('abc')
得出2748

3 楼



FUNCTION h2d001
RETURN EVALUATE("0x"-h2d001)

4 楼

在vfp 中 16 进制的数据,在前头添加 0x ,就可以直接操作,并返回 10 进制的结果。
? 0xaa * 0xbb

5 楼

真是太感谢cbl518老师的指点,简单方便!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册