Удалить бит четности (каждый девятый бит) из файла с помощью Delphi - PullRequest
1 голос
/ 09 июня 2009

Есть ли элегантный способ удалить бит четности в файле с Delphi (6)? В этом случае бит четности - это каждый 9-й бит.

Ответы [ 2 ]

4 голосов
/ 09 июня 2009

Предполагая, что ваш файл является длинным битовым потоком, содержащим 9-битные блоки, и вы хотите вывести тот же поток, но с 8-битными блоками (т.е. отбрасывая каждый 9-й бит).

Вы можете читать 9 байтов за раз (72 бита = восемь 9-битных блоков) и затем использовать сдвиг битов, чтобы поместить их в восемь 8-битных блоков.

Вам потребуется некоторая специальная обработка для обработки файла, который не кратен 9 байтам, так что это всего лишь приблизительное руководство.

procedure TForm1.Button1Click(Sender: TObject);
var
  FSIn: TFileStream;
  FSOut: TFileStream;
  InBuffer: array[0..8] of Byte;
  OutBuffer: array[0..7] of Byte;
  X: Integer;
  BytesRead: Integer;
  BytesToWrite: Integer;
begin
  FSIn := TFileStream.Create('Input.dat', fmOpenRead);
  FSOut := TFileStream.Create('Output.dat', fmCreate);
  try
    for X := 1 to FSIn.Size div 9 do
    begin
      FillChar(InBuffer[0], 9, 0);
      BytesRead := FSIn.Read(InBuffer[0], 9);
      OutBuffer[0] := InBuffer[0];
      OutBuffer[1] := (InBuffer[1] and 127) shl 1 + (InBuffer[2] and 128) shr 7;
      OutBuffer[2] := (InBuffer[2] and 63) shl 2 + (InBuffer[3] and 192) shr 6;
      OutBuffer[3] := (InBuffer[3] and 31) shl 3 + (InBuffer[4] and 224) shr 5;
      OutBuffer[4] := (InBuffer[4] and 15) shl 4 + (InBuffer[5] and 240) shr 4;
      OutBuffer[5] := (InBuffer[5] and 7) shl 5 + (InBuffer[6] and 248) shr 3;
      OutBuffer[6] := (InBuffer[6] and 3) shl 6 + (InBuffer[7] and 252) shr 2;
      OutBuffer[7] := (InBuffer[7] and 1) shl 7 + (InBuffer[8] and 254) shr 1;

      if BytesRead < 9 then
      begin
        // To do - handle case where 9 bytes could not be read from input
        BytesToWrite := 8;
      end else
        BytesToWrite := 8;

      FSOut.Write(OutBuffer[0], BytesToWrite);
    end;
  finally
    FSIn.Free;
    FSOut.Free;
  end;
end;
0 голосов
/ 10 июня 2009

Предполагая, что вы можете прочитать вещь один на один в целое число.

i: = i xor 512;

...