导航:
论坛 -> 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) 然后显示正常的汉字出来 该怎么读取?
----------------------------------------------
-
作者:
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楼:
没人会吗?好郁闷啊,网上找了半天也没有头绪
----------------------------------------------
-
作者:
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打开看到的完全不同
----------------------------------------------
-
作者:
2008/11/7 1:05:30
9楼:
可能是字符串长短不同,到底是 12 还是 32.
----------------------------------------------
(C)(P)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码的谢谢两个字能正常读取显示出来
----------------------------------------------
-
作者:
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
----------------------------------------------
-
作者:
2008/11/7 18:26:56
15楼:
还要知道文件里的字符串是UNICODE还是其它字符集吧? D2009不大清楚。 若是其它字符集,则要用MultiByteToWideChar来转换。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
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
----------------------------------------------
-
作者:
2008/11/8 0:42:21
18楼:
wt := UTF8Decode(t); 之后 wt 就是 Unicode 版的"谢谢"了,不要用 PWideChar 不要用 PChar
----------------------------------------------
(C)(P)Flying Wang
作者:
2008/11/8 0:42:56
19楼:
不过要用 PWideChar 不要用 PChar 写错了。
----------------------------------------------
(C)(P)Flying Wang
作者:
2008/11/8 0:45:36
20楼:
还有,您不要我答了一个问题您就引出 N 个新问题,您这样就是上课都会被老师批的。 学习不是像傻瓜一样见问题就问,要先自己思考,靠自己才能学会。
----------------------------------------------
(C)(P)Flying Wang