主题:关于FPT文件读取问题?
hw2007name
[专家分:4790] 发布于 2009-01-09 16:30:00
在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个回复)
沙发
foxdb [专家分:1830] 发布于 2009-01-12 12:53:00
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
*************************************
板凳
oufeiwen [专家分:910] 发布于 2009-01-20 22:34:00
[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 楼
cbl518 [专家分:57140] 发布于 2009-01-21 03:04:00
FUNCTION h2d001
RETURN EVALUATE("0x"-h2d001)
4 楼
cbl518 [专家分:57140] 发布于 2009-01-21 03:09:00
在vfp 中 16 进制的数据,在前头添加 0x ,就可以直接操作,并返回 10 进制的结果。
? 0xaa * 0xbb
5 楼
hw2007name [专家分:4790] 发布于 2009-01-21 10:36:00
真是太感谢cbl518老师的指点,简单方便!!!
我来回复