2009-06-09 8 views
1

ファイル内のパリティビットを削除するには、delphi(6)の方法がありますか?この場合、9eビットごとに。あなたのファイルを想定すると乾杯 アーネストパリティビット

+1

本当にビットを削除したいのですか、それとも*クリアするのですか? 9eの意義は何ですか? 158番目のビットがすべてパリティビットであることを意味しますか?それは奇妙に思える。 –

+3

私は彼が9番めのビットを意味すると思う。 (9eはフランス語とオランダ語で9位です)。 – Martijn

+0

ClassesユニットはTBitsクラスを定義し、メモリーブロック内のビットをアドレス指定するためにいくつかのトリックを使用します。少し複雑ですが、何が起こっているのか分かっていれば、同様のトリックを使用するコードを作成するよう促すかもしれません。 –

答えて

4

は9ビットのブロックを含む長いビットストリームである、あなたは(つまり、すべての9番目のビットを落とす)が、8ビットのブロックと同じストリーム出力したいです。

一度に9バイト(72ビット= 8、9ビットのブロック)を読み取り、次いで、8個の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

+1これはより効率的に(ポインタ、asmなど)行うことができますが、これは極端なケースでは大丈夫です。 –

+0

9バイトを読み取ることができない場合を処理するために、各読み取りの前にInBufferをクリアする必要があるように見えます。 – skamradt

0

あなたは1つ1つを整数に読むことができると仮定します。

i:= i xor 512;

+0

しかし、これはパリティビットを排除しません。 – skamradt

関連する問題