| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1755 人关注过本帖, 1 人收藏
标题:分享一个16进制文件查看器,原创哦~
只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:747
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 9楼 liunis
strtofile
2023-04-19 13:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏(1)
得分:0 
以下是引用sam_jiang在2023-4-19 13:43:32的发言:

用你的代码读取一个2.79M的图片,也是很卡,可能是我的电脑问题?看来还是需要分页显示。。。

不过你的代码真的简洁,很受启发,谢谢!

FILETOSTR极限应该是<16M,但16M对FILETOSTR来说也是“秒杀”。
2.79M就有2925527个字节,每16字节一条记录就有182845条记录多点,循环写182845条记录也就1、2秒。
问题在 SUBSTR(cs,i,16),SUBSTR不适合用来处理较大的字符串。就算每次都是SUBSTR(cs,1,16)也一样,VFP有可能每次都用副本来搜寻,慢在处理副本,否则不可能会那么差劲。

对文件大小不确定,要用低级文件函数来处理。3M左右耗时3、4秒,还可以接受。
程序代码:
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
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 tt FROM ARRAY arr
    i = i + 16
ENDDO
FCLOSE(fp)
SELECT * FROM tt




2023-04-19 15:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏
得分:0 
试试用指针来处理大字符串
程序代码:
DECLARE long _strdup IN msvcrt as apiStrdup string
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)
ps = apiStrdup(cs)
p  = ps
n  = LEN(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



2023-04-19 16:58
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1563
专家分:3007
注 册:2012-2-29
收藏
得分:0 
学习啦,谢谢!
2023-04-19 18:35
liunis
Rank: 1
等 级:新手上路
帖 子:139
专家分:7
注 册:2021-9-25
收藏
得分:0 
回复 13楼 吹水佬
图片附件: 游客没有浏览图片的权限,请 登录注册


WIN10系统,是不是缺少了什么
2023-04-19 19:32
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏
得分:0 
回复 15楼 liunis
多大的文件?
随便建个小文件试试
2023-04-19 19:42
liunis
Rank: 1
等 级:新手上路
帖 子:139
专家分:7
注 册:2021-9-25
收藏
得分:0 
回复 16楼 吹水佬
大小200KB出错。130KB左右的就正常
2023-04-19 19:52
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏
得分:0 
回复 17楼 liunis
改用 malloc 试试
程序代码:
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
2023-04-19 20:15
liunis
Rank: 1
等 级:新手上路
帖 子:139
专家分:7
注 册:2021-9-25
收藏
得分:0 
回复 18楼 吹水佬
这个可以,20MB大小 10秒左右可以完成
2023-04-19 20:18
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:747
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 18楼 吹水佬
斑主功力深不可测!
2023-04-19 20:56
快速回复:分享一个16进制文件查看器,原创哦~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019363 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved