我写了一个函数  大概的意思是 读取 TFileStream 文件, 十六进制,每次读取一个BYTE 然后转成 字符串 如下:但是转换出来的 十六进制文件 会出现乱码(读取的十六进制也应该不是汉字)??糃REATE
不知道哪写的有问题
请各位帮忙看看function TForm1.canread_str(fs : TFileStream;li_start : integer ; li_count :integer) : string;
 var
   tmp_buff : byte;
   i: integer;begin   fs.Seek(li_start,0);  //定位到开始的字节
   for i := li_start to  li_start+ li_count -1  do
   begin
        fs.Read(tmp_buff,1);
      result :=result + chr(tmp_buff)   ;   end ;

解决方案 »

  1.   

    1)判断其ascii值,如果大于128,则读两个字节;
    2)读到一个string中,按位读,如:str[k] := char(byte)
      

  2.   

    windows单元有个IsDBCSLeadByte函数,
    判断从某个字节开始,跟它后面的一个字节,是否为双字节字符.在你的循环里面,每一次循环,先用这个函数判断,如果返回的是true,表示:这个字节跟它后面那个字节连在一起,两个字节表示一个双字节的字符.
    把这两个字节一起显示出来.如果是双字节,进入下一个循环的时候,就必须跳过一个字节去判断.
      

  3.   

    1. 函数返回值需要初始化,而且要加上读到流尾的判断:function TForm1.canread_str(fs : TFileStream;li_start : integer ; li_count :integer) : string; 
    var 
      tmp_buff : byte; 
      i: integer; 
    begin 
      Result := '';
      fs.Seek(li_start,0);  //定位到开始的字节 
      for i := li_start to  li_start+ li_count -1  do 
      begin 
        if fs.Read(tmp_buff,1) < 1 then break;
        result :=result + chr(tmp_buff)  ; 
      end;
    end;2. 你确定fs文件内容都可正常转换为文本?
      

  4.   

    如果LZ所需要的函数的功能只是象LZ提供的这样直接从文件流中读出部分字符的话,可以简化成下面的函数:
    function TForm1.canread_str(fs: TFileStream;  li_start: integer; li_count: integer): string; 
    begin 
      fs.Seek(li_start, 0);
      SetLength(Result, li_count);
      fs.Read(Result[1], li_count);
    end;
      

  5.   

    针对含有汉字的字符串可以使用函数:function ByteType(const S: string; Index: Integer): TMbcsByteType;
    其中type TMbcsByteType = (mbSingleByte, mbLeadByte, mbTrailByte);
    mbSingleByte表示非汉字字符,如英文字母数字这样的(不清楚其他文字里是否也有像汉字这样占用两个字节的)
    mbLeadByte表示汉字的第一个字节
    mbTrailByte表示汉字的第二个字节
    例如对于strTest:='你好,我是Ac1350号!'
    可以用
    if ByteType(strTest,1) = mbLeadByte then
      strA[1]:=strTest[1]+strTest[2];//strA:string;
    来获取第一个汉字'你'