DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ahttp123
今日帖子: 28
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/6 0:56:49
标题:
如何读取指定文件(非文本)指定位置字符串 浏览:1446
加入我的收藏
楼主:   F:=TFileStream.Create(SelectFile,fmOpenRead);
  F.Position:=$22A;
  F.ReadBuffer(strBuf,12);
  Memo1.Lines.Add(Utf8Decode(strBuf));
一直读不出我想要的内容
如何读取文件(非文本类)指定位置开始的字符串
----------------------------------------------
-
作者:
男 azsd (曾半仙) ★☆☆☆☆ -
盒子活跃会员
2008/11/6 1:46:52
1楼: 看起来StrBuf是AnsiString/UTF8String?

SetLength(StrBuf, 12);
ReadBuffer(StrBuf[1], 12); // 可能要@, 我不用VCL, 不确定, untyped的cosnt就不用
----------------------------------------------
-
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/6 11:01:08
2楼: 好像还是不行
有没有类似读取非文本类型文件的字符串的列子?
例如读取exe文件某个地址开始的某个字符串
----------------------------------------------
-
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/6 16:19:28
3楼: 例如我想读取附件$20开始的字符串(UTF8)
然后显示正常的汉字出来
该怎么读取?
此帖子包含附件:qhq_2008116161928.rar 大小:109B
----------------------------------------------
-
作者:
男 ultramund (ultramund) ★☆☆☆☆ -
普通会员
2008/11/6 17:19:55
4楼: 你用D7还是D2009?
两者是不一样的,严格来说,D7如果后边跟汉字,要实现难度非常大,因为D7汉字是占用2字节(通过严格计算也可以做到,但十分麻烦),如果用D2009,相对好解决。
还有你要正常显示出汉字来,在哪里显示?
----------------------------------------------
QQ:56524722 老衲决定重出江湖。
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/6 17:31:34
5楼: 用的D2009
在哪里显示都无所谓
可以赋值给一个变量,或者在text里显示,或者其他可显示的控件
----------------------------------------------
-
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/6 22:10:32
6楼: 没人会吗?好郁闷啊,网上找了半天也没有头绪
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/6 22:24:18
7楼: 必须使用 PChar 或 字符数组。
而且 PChar 要初始化内存空间,所以要知道被读取的数据大小。
var
  ABuf: array[0..12] of Char;
  AString: String;
begin
   F.ReadBuffer(ABuf,12);  
end;



var
  AStr: PChar;
  AString: String;
begin
  AStr := GetMemory(13);
  try
    FillMemory(AStr,13,0);
    F.ReadBuffer(AStr,12);
    SetString(AString,AStr,StrLen(AStr));
  finally
    FreeMem(AStr);
  end;
end;


例子永远不会有。还是自己写把。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/6 22:40:44
8楼: var
  F:TFileStream;
  SelectFile : string;
  t:string;
begin
if opendialog1.Execute then
begin
  SelectFile:=opendialog1.FileName;
end else Exit ;
  F:=TFileStream.Create(SelectFile,fmOpenRead);
  F.Position:=$22A;
  F.Seek(0,soFromCurrent);
  SetLength(t,12);
  F.ReadBuffer(PChar(t)^,32);
  showmessage(t);
end;

显示的内容和我用UE打开看到的完全不同
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/7 1:05:30
9楼: 可能是字符串长短不同,到底是 12 还是 32.
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/7 1:09:34
10楼: 还有可能是 WideString
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/7 12:01:12
11楼: 长度不一定的
我实际需要读取的是多个有规律间隔的地址
最大有效长度是32,其中可能需要读取的长度只有12,剩余都是00,然后间隔一段后,又出现需要读取的字符串,长度可能只有6,其中间隔是相等的
现在只是想等读出一个再说,后面重复的再慢慢研究
以3楼附件例子来说,我就是想把里面的utf8码的谢谢两个字能正常读取显示出来
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/7 13:08:37
12楼: 你的文件可没有 $22A 那么大。

这是在读你的 1.exe ,不过长度一定要弄对.最后是编码转换.
var
  F:TFileStream;
  SelectFile : string;
  t:string;
  wt: WideString;
begin
  if opendialog1.Execute then
  begin
    SelectFile:=opendialog1.FileName;
  end else Exit ;
  F:=TFileStream.Create(SelectFile,fmOpenRead);
  F.Position:=$03;
  SetLength(t,12);
  F.ReadBuffer(PChar(t)^,12);
  SetString(t,PChar(t),StrLen(PChar(t)));
  showmessage(t);
  F.Position:=$20;
  SetLength(t,12);
  F.ReadBuffer(PChar(t)^,12);
  SetString(t,PChar(t),StrLen(PChar(t)));
  showmessage(t);
  F.Position:=$2F;
  SetLength(t,12);
  F.ReadBuffer(PChar(t)^,12);
  SetString(t,PChar(t),StrLen(PChar(t)));
  F.Free;
  showmessage(t);
  wt := UTF8Decode(t);
  showmessage(wt);  
  t := Utf8ToAnsi(t);
  showmessage(t);
end;
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/7 13:44:24
13楼: 首先感谢你的帮助
不过我试了上面的代码
读出来的还是不对
显示如下

㈱㐳㘵
냨ꊰ
냨ꊰ
???
???
----------------------------------------------
-
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/7 13:45:48
14楼: 我的系统环境是
winxp sp3
版本是d2009
----------------------------------------------
-
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2008/11/7 18:26:56
15楼: 还要知道文件里的字符串是UNICODE还是其它字符集吧?
D2009不大清楚。
若是其它字符集,则要用MultiByteToWideChar来转换。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/7 19:25:05
16楼: d2009 确实使用了 UNICODE ,不过可以把 
  t:string;
  wt: WideString;

改为
  t: AnsiString;
  wt: String;
应该就对了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qhq (qhq) ★☆☆☆☆ -
普通会员
2008/11/7 22:35:03
17楼: 总算可以正确读取了,感谢
还想再问下
如果我想把Edit里的内容转换成Unicode的怎么做,试了几个函数都不行
例如,谢谢(D0BBD0BB)转成"?(228C228C)

还有读取是ReadBuffer
那写入是不是 F.writeBuffer
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/8 0:42:21
18楼: wt := UTF8Decode(t);

之后 wt 就是 Unicode 版的"谢谢"了,不要用 PWideChar 不要用 PChar
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/8 0:42:56
19楼: 不过要用 PWideChar 不要用 PChar

写错了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2008/11/8 0:45:36
20楼: 还有,您不要我答了一个问题您就引出 N 个新问题,您这样就是上课都会被老师批的。
学习不是像傻瓜一样见问题就问,要先自己思考,靠自己才能学会。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行101.5625毫秒 RSS