我想读取二进制文件,由于delphi最小数制单位为byte,即一个字节,
我现在想实现的是: 
每次读取15位二进制,然后再在其首位加一个标志位'1',
然后再存成另一个文件.举例如下: 
原文件
 01010101011111,010101010101010
处理后文件为:
101010101011111,1010101010101010我不知道如何只读取15位,如果每次读取2个Byte,则超出了15位,还有如何添加标志位.

解决方案 »

  1.   

    建议还是先弄清楚,是直接把了个字(Word,双字节),的最高位使用1填充,还是说把整个文件当中的数据每15bit组成一个新的Word,然后再在高位用1填充。这是完全的两个概念。
      

  2.   

    to unsigned:
    是:把整个文件当中的数据每15bit组成一个新的Word,然后再在高位用1填充。如果是前者,就不用这么麻烦了。其实C++很容易搞定的事,感觉delphi还是有其弱项,只有byte和word,。拜托你一定帮忙看看。
      

  3.   


    type
      TMyArray = array[0..16] of Word;function ExpandArray(A: TMyArray;  L: Integer): TMyArray;
    var
      i : Integer;
    begin
      A[0] := 0;
      A[16] := 0;
      FillChar(Result, SizeOf(Result), 0);
      for i := 1 to L do
        Result[i] := (A[i] shr i) or (A[i-1] shl (16 - i)) or $8000;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      R, W: TFileStream;
      A, B: TMyArray;
      L   : Integer;
    begin
      R := TFileStream.Create('d:\1', fmOpenRead);
      try
        W := TFileStream.Create('d:\2', fmCreate);
        try
          R.Position := 0;
          repeat
            FillChar(A, SizeOf(A), 0);
            L := R.Read(A[1], 30);
            if L > 0 then
            begin
              if odd(L) then inc(L);
              B := ExpandArray(A, L);
              W.WriteBuffer(B[1], L + 2);
            end;
          until L < 30;
        finally
          W.Free;
        end;
      finally
        R.Free;
      end;
    end;
      

  4.   

    多谢 jadeluo,
    问题基本解决,
    但还有个小问题,
    L := R.Read(A[1], 30);这句,我读到word类型中的两个byte怎么高低位是反的。
    本来我的文件中是: 5599,结果读出来到A[i]中是9955,
    导致最终结果不对。
    还望再指点一下。