打开一个二进制dat文件,其数据如下:52 00 52 00 00 00 00 00 37 00 31 00 32 00 35 00 36 00 EB 5F 50 4E 29 59 7F 4F 00 
00 00 00 00 F8 0C DE 77 04 00……已经知道这个文本的内容是: RR 71256 快乐天使 20110410……本来以为是十六进制,但却又多了好多 00,谁知道怎么写个函数把这些文本恢复出来??

解决方案 »

  1.   

    是16进制
    0052 R ASCII码
    0052 R ASCII码
    0000
    0000
    0037 7 ASCII码
    0031 1 ASCII码
    0032 2 ASCII码
    0035 5 ASCII码
    0036 6 ASCII码
    5FEB 快 中文内码
    4E50 乐 
    5929 天
    4F7F 使
    0000
    0000
    F800 以下不知什么码了,自己结合后面的二进制及文本对照下。
    DE0C
    0477
      

  2.   

    Stream加载文件,Read读取2字节,转换为文本……如此循环,就这样
      

  3.   


    var
      s: Widestring;
      ms: TMemoryStream;
    begin
      {写入}
      ms := TMemoryStream.Create;
      s := 'RR 71256 快乐天使 20110410......';
      ms.Write(PWideChar(s)^, Length(s) * 2) ;
      ms.SaveToFile('d:\test.txt');
      ms.Free;  {取出}
      ms := TMemoryStream.Create;
      ms.LoadFromFile('d:\test.txt');
      ms.ReadBuffer(s[1],ms.Size);
      ms.Free;  {显示}
      Edit1.Text := AnsiString(s);
    end;以上是 D2007(含)以下版本的写法,其实用 D2009(含)并不用那么复杂,因为高版本已经是 widestring 了,多年期待的统一字符已经实现了,我们还有什么理由不用新版本?
      

  4.   

    谢谢各位,小帆的很接近了,但是不知道你有没注意到: 00 00 00 00 00  这些字节,一到ms.ReadBuffer(s[1],ms.Size)这句就出错了用写入这段,保存后的字节是不一样的:52 00 52 00 20 00 20 00……
      

  5.   

    可以试试var
      s: Array of PWideChar;
      ms: TMemoryStream;
      iL: Int64;
    begin
      {取出}
      ms := TMemoryStream.Create;
      ms.LoadFromFile('d:\test.txt');
      iL:= ms.Size;
      SetLength(s, iL);
      ms.ReadBuffer(s[0], ms.Size);
      ms.Free;  {显示}
      Edit1.Text := AnsiString(s);
    end;
      

  6.   

    0000是ASSII码NULL,看上去是NULL结束的宽字符串,但后面又多一个NULL。