因为是两个有符号参数,我先担心 vfp 会把 0x8000,0000 变成负数形式传给第一个参数
刚试了试,传 -1 进去会返回 3.99GB,这就大致清楚了
刚试了试,传 -1 进去会返回 3.99GB,这就大致清楚了

这家伙很懒,啥也没留下
程序代码:
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
**************************************************
*-- Form: form1 (d:\documents\visual foxpro 项目\bmpviewer.scx)
*-- ParentClass: form
*-- BaseClass: form
*-- Time Stamp: 04/22/23 02:52:02 PM
*
DEFINE CLASS form1 AS form
Height = 654
Width = 852
DoCreate = .T.
AutoCenter = .T.
Caption = "位图文件查看器"
*-- 保存文件数据流。
string = ""
Name = "Form1"
ADD OBJECT command1 AS commandbutton WITH ;
AutoSize = .T., ;
Top = 0, ;
Left = 0, ;
Height = 25, ;
Width = 78, ;
Caption = "打开BMP文件", ;
Name = "Command1"
ADD OBJECT commandgroup1 AS commandgroup WITH ;
ButtonCount = 4, ;
Value = 1, ;
Height = 34, ;
Left = 1, ;
Top = 27, ;
Width = 70, ;
Name = "Commandgroup1", ;
Command1.Top = 5, ;
Command1.Left = 5, ;
Command1.Height = 25, ;
Command1.Width = 60, ;
Command1.Caption = "首页", ;
Command1.Name = "Command1", ;
Command2.Top = 32, ;
Command2.Left = 5, ;
Command2.Height = 25, ;
Command2.Width = 60, ;
Command2.Caption = "下一页", ;
Command2.Name = "Command2", ;
Command3.Top = 59, ;
Command3.Left = 5, ;
Command3.Height = 25, ;
Command3.Width = 60, ;
Command3.Caption = "前一页", ;
Command3.Name = "Command3", ;
Command4.Top = 86, ;
Command4.Left = 5, ;
Command4.Height = 25, ;
Command4.Width = 60, ;
Command4.Caption = "末页", ;
Command4.Name = "Command4"
ADD OBJECT combo1 AS combobox WITH ;
Height = 24, ;
Left = 748, ;
Top = 35, ;
Width = 100, ;
Name = "Combo1"
ADD OBJECT label1 AS label WITH ;
AutoSize = .T., ;
Caption = "当前页:", ;
Height = 16, ;
Left = 695, ;
Top = 39, ;
Width = 50, ;
Name = "Label1"
ADD OBJECT label2 AS label WITH ;
AutoSize = .T., ;
Caption = "", ;
Height = 16, ;
Left = 100, ;
Top = 6, ;
Width = 2, ;
Name = "Label2"
ADD OBJECT pageframe1 AS pageframe WITH ;
ErasePage = .T., ;
PageCount = 3, ;
TabStyle = 1, ;
Top = 66, ;
Left = 1, ;
Width = 852, ;
Height = 587, ;
TabOrientation = 1, ;
Name = "Pageframe1", ;
Page1.Caption = "Num", ;
Page1.Name = "Page1", ;
Page2.Caption = "Hex", ;
Page2.Name = "Page2", ;
Page3.Caption = "Str", ;
Page3.Name = "Page3"
ADD OBJECT form1.pageframe1.page1.grid1 AS grid WITH ;
Height = 558, ;
Left = 0, ;
Top = 0, ;
Width = 847, ;
Name = "Grid1"
ADD OBJECT form1.pageframe1.page2.grid1 AS grid WITH ;
Height = 558, ;
Left = 0, ;
Top = 0, ;
Width = 847, ;
Name = "Grid1"
ADD OBJECT form1.pageframe1.page3.grid1 AS grid WITH ;
Height = 558, ;
Left = 0, ;
Top = 0, ;
Width = 847, ;
Name = "Grid1"
PROCEDURE Init
CREATE CURSOR temp (字节偏移 c(7),f1 N(3,0),f2 N(3,0),;
f3 N(3,0),f4 N(3,0),f5 N(3,0),;
f6 N(3,0),f7 N(3,0),f8 N(3,0),;
f9 N(3,0),f10 N(3,0),f11 N(3,0),;
f12 N(3,0),f13 N(3,0),f14 N(3,0),;
f15 N(3,0),f16 N(3,0))
thisform.pageframe1.page1.grid1.RecordSourceType= 1
thisform.pageframe1.page1.grid1.RecordSource="temp"
FOR i=0 TO 9
thisform.pageframe1.page1.grid1.Columns(i+2).header1.caption=TRANSFORM(i)
ENDFOR
FOR i=1 TO 6
thisform.pageframe1.page1.grid1.Columns(i+11).header1.caption=CHR(i+64)
ENDFOR
ENDPROC
PROCEDURE command1.Click
IF >0
=GETFILE("bmp")
*!* cfile=GETFILE() 改这句可以查看任何类型文件。
IF EMPTY(cfile) OR !FILE(cfile)
RETURN
ENDIF
thisform.label2.Caption=cfile
thisform.string=FILETOSTR(cfile)
nlen=LEN(thisform.string)
npages=CEILING(nlen/80000)
*************************为避免数据导入太大导致系统假死,故分页显示***********************
FOR i=1 TO npages
(TRANSFORM(i))
ENDFOR
="1" &&记录当前页
IF 1
("Enabled",.t.)
=.f.
ENDIF
*!* DECLARE long malloc IN msvcrt as apiMalloc long
*!* DECLARE long free IN msvcrt as apiFree long
*!* CREATE CURSOR tt (字节偏移 c(8),f0 c(2),f1 c(2),f2 c(2),f3 c(2),f4 c(2),f5 c(2),f6 c(2),f7 c(2),;
*!* f8 c(2),f9 c(2),fa c(2),fb c(2),fc c(2),fd c(2),fe c(2),ff c(2))
*!* fn = GETFILE()
*!* IF !FILE(fn)
*!* RETURN
*!* ENDIF
*!* cs = FILETOSTR(fn)
*!* n = LEN(cs)
*!* ps = apiMalloc(n)
*!* IF ps == 0
*!* ? "分配内存失败"
*!* RETURN
*!* ENDIF
*!* p = ps
*!* SYS(2600,p,n,cs)
*!* m = 0
*!* DO WHILE m < n
*!* ALINES(arr,RIGHT(TRANSFORM(m,"@0"),8)+TRANSFORM(STRCONV(SYS(2600,p,IIF((n-m)<16,n-m,16)),15),"@R "+REPLICATE(" ##",16)),15,0h20)
*!* INSERT INTO tt FROM ARRAY arr
*!* p = p + 16
*!* m = m + 16
*!* ENDDO
*!* apiFree(ps)
*!* *SELECT * FROM tt
*!* thisform.grid1.RecordSourceType = 1
*!* thisform.grid1.RecordSource ="tt"
ENDPROC
PROCEDURE commandgroup1.Click
thisform.pageframe1.ActivePage=1
thisform.pageframe1.Click()
DO CASE
CASE this.Value=1
IF 1"
="1"
this.SetAll("enabled",.t.)
=.f.
=.f.
ENDIF
CASE this.Value=2
this.SetAll("enabled",.t.)
IF VAL()=-1
=.f.
ENDIF
=TRANSFORM(VAL()+1)
CASE this.Value=3
this.SetAll("enabled",.t.)
IF ="2"
=.f.
ENDIF
=TRANSFORM(VAL()-1)
CASE this.Value=4
this.SetAll("enabled",.t.)
IF ()
=transf()
=.f.
=.f.
ENDIF
ENDCASE
ENDPROC
PROCEDURE commandgroup1.Init
lastleft=this.Buttons(1).left
lastwidth=this.Buttons(1).width
FOR i=2 TO this.ButtonCount
this.buttons(i).top=this.buttons(1).top
this.buttons(i).left=lastleft+lastwidth+2
lastleft=this.buttons(i).left
lastwidth=this.buttons(i).width
ENDFOR
this.AutoSize=.t.
this.setall("Enabled",.f.)
ENDPROC
PROCEDURE combo1.ProgrammaticChange
this.InteractiveChange()
ENDPROC
PROCEDURE combo1.InteractiveChange
thisform.pageframe1.ActivePage=1
thisform.pageframe1.Click()
ZAP
nlen=LEN(thisform.string)
IF VAL()==ceiling(MOD(nlen,80000)/16)
ELSE
nrow=5000 &&每页最大显示5000行
ENDIF
*************************设置第一列***********************
FOR i=1 TO nrow
APPEND BLANK
cstr=TRANSFORM((val()-1)*5000+i-1,"@0")
REPLACE 字节偏移 with SUBSTR(cstr,4,LEN(cstr)-2)
ENDFOR
*************************将分页数据存在数组里,以便快速添加到表里***********************
dispdata=SUBSTR(CHR(0)+thisform.string,(val()-1)*80000+1,nrow*16)
&&数组下标是从1开始的,而表格的第一列的坐标是0,0,dispdata的第一个数据实际上是数组的第二个元素。在dispdata的最前面加个空字符,就解决了。
DIMENSION colordata[nrow,16]
STORE 0 TO colordata &&对数组初始化,以防出现错误
FOR i=1 TO LEN(dispdata)
colordata[i]=ASC(SUBSTR(dispdata,i,1))
ENDFOR
*************************将数组数据复制到表里***********************
GO top
REPLACE FROM ARRAY colordata FIELDS like f* for RECNO()<=5000
thisform.pageframe1.page1.grid1.Refresh()
DO CASE
CASE this.ListCount=1
("enabled",.f.)
CASE this.Value="1" AND this.ListCount>1
= .F.
= .F.
CASE VAL(this.Value)=this.ListCount AND this.listcount>1
= .F.
= .F.
OTHERWISE
("enabled",.t.)
ENDCASE
*!* fn = GETFILE()
*!* IF !FILE(fn)
*!* RETURN
*!* ENDIF
*!* fp = FOPEN(fn)
*!* i = 0
*!* DO WHILE ALINES(arr,RIGHT(TRANSFORM(i,"@0"),8)+TRANSFORM(STRCONV(FREAD(fp,16),15),"@R "+REPLICATE(" ##",16)),15,0h20) > 1
*!* INSERT INTO temp FROM ARRAY arr
*!* i = i + 16
*!* ENDDO
*!* FCLOSE(fp)
ENDPROC
PROCEDURE pageframe1.Click
DO CASE
CASE this.ActivePage=1
SELECT temp
case this.ActivePage=2
*!* MESSAGEBOX("You have clicked page2!")
SELECT 字节偏移,RIGHT(TRANSFORM(f1,'@0'),2) as h0,;
RIGHT(TRANSFORM(f2,'@0'),2) as h1,;
RIGHT(TRANSFORM(f3,'@0'),2) as h2,;
RIGHT(TRANSFORM(f4,'@0'),2) as h3,;
RIGHT(TRANSFORM(f5,'@0'),2) as h4,;
RIGHT(TRANSFORM(f6,'@0'),2) as h5,;
RIGHT(TRANSFORM(f7,'@0'),2) as h6,;
RIGHT(TRANSFORM(f8,'@0'),2) as h7,;
RIGHT(TRANSFORM(f9,'@0'),2) as h8,;
RIGHT(TRANSFORM(f10,'@0'),2) as h9,;
RIGHT(TRANSFORM(f11,'@0'),2) as h10,;
RIGHT(TRANSFORM(f12,'@0'),2) as h11,;
RIGHT(TRANSFORM(f13,'@0'),2) as h12,;
RIGHT(TRANSFORM(f14,'@0'),2) as h13,;
RIGHT(TRANSFORM(f15,'@0'),2) as h14,;
RIGHT(TRANSFORM(f16,'@0'),2) as h15;
FROM temp INTO CURSOR temp1
this.page2.grid1.recordsourcetype=1
this.page2.grid1.recordsource="temp1"
FOR i=0 TO 9
this.page2.grid1.Columns(i+2).header1.caption=TRANSFORM(i)
ENDFOR
FOR i=1 TO 6
this.page2.grid1.Columns(i+11).header1.caption=CHR(i+64)
ENDFOR
this.page2.grid1.setall("width",24)
this.page2.grid1.Columns(1).width=55
CASE this.ActivePage =3
SELECT 字节偏移,CHR(f1) as h0,;
chr(f2) as h1,;
chr(f3) as h2,;
chr(f4) as h3,;
chr(f5) as h4,;
chr(f6) as h5,;
chr(f7) as h6,;
chr(f8) as h7,;
chr(f9) as h8,;
chr(f10) as h9,;
chr(f11) as h10,;
chr(f12) as h11,;
chr(f13) as h12,;
chr(f14) as h13,;
chr(f15) as h14,;
chr(f16) as h15;
FROM temp INTO CURSOR temp2
this.page3.grid1.recordsourcetype=1
this.page3.grid1.recordsource="temp2"
FOR i=0 TO 9
this.page3.grid1.Columns(i+2).header1.caption=TRANSFORM(i)
ENDFOR
FOR i=1 TO 6
this.page3.grid1.Columns(i+11).header1.caption=CHR(i+64)
ENDFOR
this.page3.grid1.setall("width",24)
this.page3.grid1.Columns(1).width=55
ENDCASE
ENDPROC
ENDDEFINE
*
*-- EndDefine: form1
**************************************************