2016-04-15 6 views
1

Ich schreibe gerade einen Zufallszahlengenerator, der einen Pseudozufall int erzeugt und dann einen int zurückgibt, der das niedrigstwertige Bit im int Wert darstellt.Konstruiere ein Byte aus einzelnen Bits in Java

public class RNG { 

    //algorithm input: first input is the seed 
    private int x; 

    //primes for calculating next random number 
    private int p; 
    private int q; 

    //constructor 
    public RNG() 
    { 
     p = getPrime(); 
     q = getPrime(); 

     //make sure p and q are not equal 
     while(p == q) 
     { 
      q = getPrime(); 
     } 

     //seed must not be divisible by p or q 
     //easiest way is to make the seed another prime number 
     //this prime does not need to be congruent to 3 mod 4, so 
     //getPrime() is not used. 

     x = (BigInteger.probablePrime(8, new Random())).intValue(); 
    } 

    //return a pseudorandom prime number using java.util.Random such that 
    //the number is congruent to 3 mod 4 
    private int getPrime() 
    { 
     Random rand = new Random(); 
     int i; 
     while(true) 
     { 
      //generates a random BigInteger. The probability 
      //this BigInteger is composite is less than 2^-100 
      //bitLength is 8 so maximum prime value is 251 
      i = (BigInteger.probablePrime(8, rand)).intValue(); 
      if((i % 4) == (3 % 4)) 
      { 
       break; 
      } 
     } 

     return i; 
    } 

    public int next() 
    { 
     //calculate next algorithm input 
     int next = (x * x) % (p * q); 

     //set algorithm input for next next() call 
     x = next; 

     //return least significant bit 
     return next & 1; 
    } 
} 

Das Ziel des Programms ist es, einen Rückgabewert zu schaffen, dass eine Test-Klasse in eine Datei dann schreiben kann, und weil der Ausgang das am wenigsten signifikante Bit der zufällig erzeugte Zahl ist, wird der Ausgang sein kryptographisch sicher.

Wenn ich jedoch versuche, die Implementierung der Testklasse durchzuführen, habe ich Probleme, herauszufinden, was ich mit der Ausgabe machen soll. Ich brauche die Testklasse, um 512 Bits in eine Ausgabedatei schreiben zu können. Die FileOuputStream-Klasse kann jedoch nur Bytes in die Ausgabedatei schreiben.

Was ich versuche herauszufinden ist, ob es eine Möglichkeit gibt, die einzelnen 1 oder 0 Ausgänge von meinem Zufallsgenerator in Byte-Werte zu gruppieren, aber bisher habe ich nichts gefunden, was in Java unterstützt wird.

+2

Wissen Sie über [ 'java.util.BitSet' ] (http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html)? – Radiodef

+0

@Norsk Übrigens ... die Antwort dort erstellt eine physische Datei. Die andere Antwort besagt, dass Sie keine virtuelle Datei erstellen können. – Radiodef

Antwort

5

Sie konstruieren Bytes (oder ints oder Long-Positionen) unter Verwendung von Bit mit dem << Operator (oder der Bit-Verschiebungszuweisungs-Operator <<=) Verschiebung

byte b = 0; 
for (int i = 0; i < 8; i++) { 
    b <<= 1; 
    b |= rng.next(); 
}