import java.io.*;
public class Encode {
InputStream in; // input file
OutputStream out; // output file
long seed1;
long seed2;
long seed;
long seed3;
long seed4;
long seed5;
long ah1 = 161803398;
long ah2 = 316227766;
long ah3 = 230258509;
long ah4 = 577215664;
public Encode() {
}
public Encode(InputStream infile, OutputStream outfile, String passwd) {
in = infile;
out = outfile;
seed1 = hashit(passwd, ah1);
seed2 = hashit(passwd, ah2);
seed3 = hashit(passwd, ah3);
seed4 = hashit(passwd, ah4);
}
// writeByte: write byte
private void writeByte(int b) {
try {
out.write(b);
} catch (IOException e) {
System.err.print("Error writing file");
System.exit(-1);
}
}
public void processFile() {
try {
int b; // input byte
while ((b = in.read()) != -1) {
int r = randByte();
int s = randByte3();
b = b ^ r ^ s;
writeByte(b);
} // end of while
} catch (IOException e) {
System.err.println("Error reading input file");
System.exit(-1);
} // end try
}
// rand: version using doubles. Works on all hardware.
// seed1 = 48271*seed1 mod 2^31 - 1
// seed2 = 40691*seed1 mod 2^31 - 249
// seed = (seed1 - seed2) mod 2^31 -1
private double rand() {
long a1 = 48271, a2 = 40692,
m = 2147483647, m2 = 2147483399;
long q1, q2;
long q, diff;
seed1 = a1*seed1; seed2 = a2*seed2;
q1 = seed1/m; q2 = seed2/m2;
seed1 = seed1 - q1*m; seed2 = seed2 - q2*m2;
// now combine results
if ((diff = seed1 - seed2) < 0.0) diff = diff + m;
q = diff/m;
seed = diff - q*m;
return((double)seed/(double)m);
}
private int randByte() {
int b = (int)(256.0*rand());
return b;
}
private double rand3() {
long a3 = 271828183,
a4 = 314159269,
m2 = 2147483399;
long q3;
seed5 = (a3*seed3 - a4*seed4) % m2;
if (seed5 < 0) seed5 = seed5 + m2;
seed3 = seed4;
seed4 = seed5;
return((double)seed5/(double)m2);
}
private int randByte3() {
int b = (int)(256.0*rand3());
return b;
}
public long hashit(String key, long ah) {
long s = ah; // 2^30 - 35
long m = 2147483647;
long a = s;
for (int i = 0; i < key.length(); i++) {
s = (s + ah*key.charAt(i)) % m;
}
return s;
}
}