Problem mit Bitsets

HansWM

Grünschnabel
Es sollen zwei Dateien verglichen und die Anzahl der Einzelbitfehler, Doppelbitfehler usw. gezählt werden. Leider ist das Ergebnis abhängig von der Grösse der BLOCKSIZE und offensichtlich falsch. Aber wo liegt der Fehler ?
Code:
public class BiterrorMain
{
	public static void main (String[] args) throws Exception
	{
		Biterror Compare = new Biterror ();
		Compare.compareFiles ();
	}
}

Code:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.BitSet;
import java.lang.String;

public class Biterror
{
	private final static int MASK = 128;
	private final static int EOF = -1;
        // Für BLOCKSIZE = 32 ist das Ergebnis in Ordnung
        // Testdatei wurde mit einem Hexeditor erstellt
        // Blockgrösse in Byte
	private final static int BLOCKSIZE = 16;
	private final static int ORDER = 5;
        // Die Dateien liegen nicht bei
        // Datei mit 1024 Null Bits
	private final static String File1 = "TxFileNull1024Bit.txt";
        // Datei mit Einzel- und Doppelbitfehlern
	private final static String File2 = "RxFileNull1024Bit.txt";
	
	int[] BlockVector = new int[ORDER+1];
	int[] SumVector = new int[ORDER+1];;
    

	private BitSet readBlock (FileInputStream File, BitSet BitSet) throws Exception
	{
		int b;
		int index = 0;
		
		try
		{
			// Lese ein Byte als int
			while ((b=File.read()) != EOF && (index < (BLOCKSIZE*8)))
			{
				// Konvertierung von int in BitSet
				for (int i = 0; i < 8; ++i)
				{
					// Prüfe ob das höchstwertige Bit gesetzt ist
					if ((b&MASK) == MASK) BitSet.set (index);
									 else BitSet.clear (index);
					// Inkrementiere den Bitindex	
					index++;
					// Bitshift um 1 Bit nach links
					b <<= 1;
				}
			
			}
		} // try
		catch (IOException e)
		{
			System.out.println (e);
		}
		return BitSet;
	}
	
	private int[] countBiterrors (BitSet NewBitSet)
	{
		int index = 0;
		int length;
		
		while (index < NewBitSet.length())
		{
			// Überlese führende Null-Bits
			while (NewBitSet.get(index) == false) ++index;
			length = 0;
				// Lese Einser-Bits und bestimme die Länge
				while (NewBitSet.get(index) == true)
				{
					++index;
					++length;
				}
				// Verwende die Länge als Index
				// Einzelbitfehler in BlockVektor[0] usw.
				if (length <= ORDER)
			  		++BlockVector[length-1];
				// Die "restlichen" Bitfehler werden addiert	
				else 
			  		++BlockVector[ORDER];
	
			System.out.println(); 	
		}
		return BlockVector;
	}
	
	private void printBitSet (BitSet b)
	{
		for (int i = 0; i < b.length(); ++i)
		{
			if (b.get (i))
				System.out.print ("1");
			else
				System.out.print ("0");
			if ((i+1)%8 == 0) System.out.print("'");
		}
		System.out.println();
	}
	
	private void printBiterrors (int[] Biterrors)
	{
		for (int i = 0; i < Biterrors.length; ++i)
		{
			System.out.print (""+(i+1)+"-Bitfehler = ");
			System.out.println (Biterrors[i]);
		}
	}
		
	public void compareFiles () throws Exception
	{
		int BlockCounter = 0;
		FileInputStream Original;
		FileInputStream Copy;
		BitSet OriginalBitSet = new BitSet (BLOCKSIZE*8);
		BitSet CopyBitSet = new BitSet (BLOCKSIZE*8);
		BitSet NewBitSet = new BitSet(BLOCKSIZE*8);
		int[] BlockVector = new int[ORDER+1];
		
		try
		{
			Original = new FileInputStream (File1);
			Copy = new FileInputStream (File2);
                        // Lese die ersten 8 Blöcke
                        // Eigentlich lesen bis Dateiende
			while (BlockCounter < 8)
			{
				System.out.println();
				System.out.print ("Block ");
				System.out.println (BlockCounter);
				OriginalBitSet = readBlock (Original,OriginalBitSet);	
				CopyBitSet = readBlock (Copy,CopyBitSet);
				System.out.println ("The First Bitset");
			    printBitSet (OriginalBitSet);
			    System.out.println ("The Second Bitset");
			    printBitSet (CopyBitSet);
				NewBitSet = (BitSet) OriginalBitSet.clone ();
				NewBitSet.xor (CopyBitSet);
				System.out.println ("The XORed Bitsets");
				printBitSet (NewBitSet);
				// Falls das "Ergebnis" Einsen enthält
				if (!NewBitSet.isEmpty())
				{	
					BlockVector = countBiterrors (NewBitSet);
					printBiterrors (BlockVector);
				}
				else
					System.out.println ("Blocks are equal");
				BlockCounter++;
				for (int i = 0; i <= ORDER; ++i)
				{
			   		SumVector[i] += BlockVector[i];
			   		// Reset für den nächsten Block
			   		BlockVector[i] = 0;
				}   
			} // while
			System.out.println();
			printBiterrors (SumVector);
		} // try
		catch (FileNotFoundException e)
		{
			System.out.println (e);
		}
	}
	

}
 
Zurück