如题,如何快速读取十六进制BIN文件?
对于100K以上的BIN文件,大家有没有更快的方式读取呢?

解决方案 »

  1.   

    个人认为用TFileStream或TMemoryStream最方便,对于K级文件,应该很快的
      

  2.   

    不明白!既然是BIN文件,本身就是2进制文件,直接读取就得了,而16进制一般都是ASCII形式的,那就不是BIN文件了,请搂主描述清楚
      

  3.   

    BIN只是格式啊,文件内部是十六进制字符串。
      

  4.   

    我把函数贴上来了,请帮我看看是哪儿处理不对啊。
    如何以缓存的方式读取呢?
    目前只能读取几K的文件,稍大一点的就读取失败。//读取文件函数
    function   ReadFile1(FileName:String):boolean;
    var
      sFileName: string;
      f: TfileStream;
      ED_Data: array[0..2048] of char;
      lRet: integer;
      lOffset: Longint;
      lOrigin: Word;
       i,count:integer;
    begin
        sFileName:=form1.opendialog1.FileName;
        f := TfileStream.Create(sFileName,fmOpenRead);
      try
        f.Seek(lOffset,lOrigin); //文件定位,从lOrigin开始移动lOffset
        begin
        lRet := f.Read(f,count); //lRet为实际读到的字节数,ED_Data为读到的内容
         form1.Memo2.Lines.LoadFromStream(f);
          j:=f.size div 1024;   //计算文件一共有多少个包
       // form1.suimemo1.Text:=strtohexstr(ed_data[count]);
         Application.ProcessMessages;
          begin
      for  i:=0   to j do
      begin
        form1.Label1.Caption:='正在读取第 '+inttostr(i)+' 包 ';
        form1.Memo1.Text:=form1.Memo1.Text+ midstr(strtohex(form1.Memo2.text),2048*i,2048)+'               ';
    //Progressbar进度栏
        form1.ProgressBar1.Max :=j;
        form1.ProgressBar1.Min:=0;
        form1.ProgressBar1.Position := i;
        Application.ProcessMessages;
      end;  //  form1.memo2.clear;
       showmessage('成功读取'+inttostr(i)+'个包');
       Application.ProcessMessages;
    end;
       end;  finally
         FreeAndNil(f);
         Application.ProcessMessages;
      end;
    end;
      

  5.   

    扩展名是.bin?那是没有关系的,主要看内部存储方式
      

  6.   

    BlockRead
    还有楼上说的2进制和16进制的文件区别是什么?不明白
      

  7.   


    用BLOCKREAD 怎么读取到MEMO上啊 ?
      

  8.   


    可以帮我看看我的函数哪儿出问题了吗? 
    //读取文件函数function   ReadFile0(FileName:String):boolean;
    var
      F:File;
      Src:Array[0..1024-1]   of   Char;
      i,j,numread:Integer;
    begin 
      result:=True; 
      if   not   FileExists(FileName)   then 
        begin 
          result:=false; 
          exit; 
        end;
      AssignFile(F,FileName); 
      Reset(F,1);  if filesize(F) < sizeof(Src) then
       begin //Test
        CloseFile(f);
        showmessage('文件大小错误');
        exit;
      end;
    { //while   not   Eof(F)   do
       while  numread<>0   do      BlockRead(F,Src,sizeof(Src),numread);
          form1.Memo1.text:=Src[numread];
          Application.ProcessMessages;
     }
    repeat
          BlockRead(F,Src,sizeof(Src),numread);
          FOR i:=0 to numread  do
          begin
          form1.Memo1.lines.GetText[i]:=Src[i];
          Application.ProcessMessages;
          end;
    until (NumRead = 0) ;
        CloseFile(F);
        Application.ProcessMessages;
    end;
      

  9.   

    你的文件使用的字符编码??
    如果是二进制文件其中数据不是字符编码,不是人可以看懂的写在memo上也没有意义啊
    如果不是
    var
      F:File;
      Buf:array[0..255] of Char;
      
    Begin  
    AssignFile(F,TempFileName);
        Reset(F,1);
        if IoResult=0 then begin
            repeat
    BlockRead(F, Buf, 256, BytesRead);
    if BytesRead>0 then
    Memo.Lines.Add(StrPas(Addr(Buf));
            until BytesRead=0;
            CloseFile(F);
        end;
    end;
      

  10.   


    YKTD26,用了你提供这个函数读取大文件还是不对啊,10几K的文件就没有问题。这是怎么回事啊?
      

  11.   


    *************************************************************************************
    读取小文件取到MEMO的字符串为以下:馃?馃?馃?馃?馃  犪馃?馃錖? @   L   X   h       ?  ?  _-锧> ?燒?_-?> ?燒?郚?_-?> ?燒?郚?_-?> ?燒钀€忊 樿 €?佮 傕0冟癅?繠? P?  
    p 拌 T狷
     ?@? ?P? ?P?P陪`V?p?p??婎? R醸   p犮0 茶 ?@? ?@?@你PU?p??婒晷? ? ? (?   崂€?? 崂?
    饫 Q泺馉 ??馉徇?? 豚B熷P犮 P腻谺熷 @斿 袛?@濅?? 濅濅 濅0濅@濅P濅`濅p濅€濅悵?牆?皾?罎?酀?饾?????????????€-?p-?`-?P-?@-?0-? -?-? - @?@-錒B熷 P斿 袇遘  ?B熷<R熷 `斟 `腻(B熷 b熷 `栧 `勫 袞?@濅?? 濅濅 濅0濅@濅P濅`濅p濅€濅悵?牆?皾?漓
    ?酀?饾淞  胄A熷蠶熷 `斟 `腻糀熷碼熷 `栧 `勫 袞?@濅?? 濅濅 濅0濅@濅P濅`濅p濅€濅悵?牆?皾?罎?酀?饾?0-? -?-?犪 袓? N 0O徇?? -???????????€-?p-?`-?P-?@-?@戜P戜`戜`-?P-?@-? -?0-?熷 绣佲 厘 Q?  郂熷 P斿 袇逡?汔 熷酄?/徇?爿 ?@濅?? 濅濅?
     濅0濅@濅P濅`濅p濅€濅悵?牆?皾?罎?酀?饾? -?犪 袓? N 0O徇?? -轲_-閜 辫p -? -? -門 熷 绣佲 厘 Q?  0@熷 P斿 袇逖?? 熷酄?/徇?惚 ? 借??呓鑮€?€?€r€s€p€P  堸  馉?馉?馉?馉?馉?馉?@- 罓  犪 犪 纮弭@熷郂? 犪 @庡鐯熷郂? 犪 @庡蹳熷郂? 犾
      

  12.   


    ***********************************************************************************
    读取大文件时取到的字符串:馃?馃?馃?馃?馃?
    PU?p??婒陘+
    <B熷<R熷
    ??????€-?p-?`-?P-?@-?@戜P戜`戜`-?P-?@-?
    
    
    ?0犮, 熷
    0€借0@-閐犮?熷?隌犮?熷?霚7熷燱熷
    馉?
    佱
    饋借?熷
    ye€P`€|(
    ?
    犮
    
    ?
    
    嗿?
    `犪P犪
    
    4@勨??
    ?牮A-?
    熷
    熷
    p@-?
    p犪
    
    
    D`熷
    熷
    ?
    鳣-?
    
    
    竊尼
    
    
    <X熷
    误?
    
    
    
    悟隯
    ??
    
    ??
    
    犍?
    
    鼇借 嶁犪T
    
    ??@-?
    ??
    
    `犪p犪@呭p犪皅裴
    
    `腻酄?馉?
    ?
    
    
    
    
    
    勦?熷掔?
    勦?熷
    ??
    盃?
    #
    傕戝
    
    勦
    
     臓?滥?P皱
    嶟?
    酄?馉?
    i
    ?贶)
    ??
     犮
    犪
    犮
    ?
    
    犪
    
    w
    犮 Q?
    勨蔰
    
     €?
    
    ?熷?葆
    ?旰0籴缆熷袄茚脆葆繪?
    
    7
    P犪
     犪 犪犪!L€徼?濆€?濆€?@€?
    
    ?嗅?箩?熷0B喟佬釥銦?缹嗖0提饾?@-閐犮?熷奯
    
    dP?
    皜裴?8@-?
    ??`
    ?
    ??
    
    8@-?
    
    
    0団 犪
    
    @斿??
    
      

  13.   

    memo好像有长度限制
    用richtext替代试试