Delphi 2010 Blockread似乎获得的数据与以前的版本不同

时间:2010-08-05 02:25:40

标签: delphi delphi-2010

我在D2010下重新编译了旧的MP3 Id3标签阅读器,似乎再也找不到标签了。

代码非常简单,但它不起作用。 调试器显示大量零,然后在结果中出现chineese标志!

    var dat:file of char;
    id3:array [0..TAGLEN] of Char;  //is 0..127 for ID3 v1
begin
   vValid:=True;
   if FileExists(vFilename) then begin
      assignfile(dat,vFilename);
      If (FileGetAttr(vFilename)>32) or (FileGetAttr(vFilename)=1) then
        Filemode:= 0
      Else
        Filemode:= 2;
      reset(dat);
      seek(dat,FileSize(dat)-128);
      blockread(dat,id3,128);
      closefile(dat);
      vMP3tag:=copy(id3, 0, 3);
      if vMP3Tag='TAG' then begin
         vTitle:=strip(copy(id3, 4, 30),' ');
         vArtist:=strip(copy(id3, 34, 30), ' ');

我听说过关于Unicode和PansiChar的一些内容,但我仍然不太了解这些做了什么:)

感谢您寻找

2 个答案:

答案 0 :(得分:2)

试试这个:

 var dat:file of AnsiChar;
id3:array [0..TAGLEN] of AnsiChar;  //is 0..127 for ID3 v1

当然,如果您的文件是基于ansi而不是基于unicode。我不知道mp3文件的id3标签中可能包含什么内容。

如果您想了解其中的差异,white paper向我解释了这一切。基本上,Unicode使用更多的内存空间来存储单个字符(比如ansi字符数量的4倍),但是它们允许使用ansi不提供的字符,例如中文和日文。只要阅读白皮书,那么一切都会清楚。

简而言之,Ansichar和Ansistring在D2009之前曾经是Delphi中的一个字符串。在那些日子里,你的应用程序将不兼容unicode(默认情况下你不能输入中文字符)。 从D2009开始,字符串的定义从ansistring变为widestring,ansichar变为widechar。这意味着默认情况下您的应用程序将是unicode。但是旧代码,期望字符串是ansicode,需要进行调整以反映这种变化。 你的代码说char,意思是ansichar到D2009之前的编译器,但是宽到D2009 +编译器。换句话说,新的编译器会以不同的方式读取您的代码。

我希望能够解释一下。

答案 1 :(得分:0)

喔!

似乎AnsiCHar而不是Char是D2010的方式。

ANSI-炭火他们-一切!