package solarsim.io; import solarsim.common.Vector; import java.io.IOException; import java.io.InputStream; /** * Clasa Wrapper pentru InputStream care permite citirea de valori care au fost scrise de programul in C * @author Marius Ion */ public class MyInputStreamReader { private InputStream in; public MyInputStreamReader(InputStream in) { this.in = in; } /** * Citeste un double scris in binar (8 octeti) din streamul de intrare * @return numarul citit citit * @throws IOException cand s-a produs o eroare la citirea din InputStream-ul incapsulat */ public double readDouble() throws IOException { byte [] buf = new byte[8]; while( in.available() < 8 ) try { Thread.currentThread().sleep(1000); } catch (InterruptedException ex) {} in.read(buf, 0, 8); return arr2double(buf, 0); } /** * Citeste un float scris in binar (4 octeti) din streamul de intrare * @return numarul citit citit * @throws IOException cand s-a produs o eroare la citirea din InputStream-ul incapsulat */ public double readFloat() throws IOException { byte [] buf = new byte[4]; while( in.available() < 4 ) try { Thread.currentThread().sleep(1000); } catch (InterruptedException ex) {} in.read(buf, 0, 4); return arr2float(buf, 0); } /** * Citeste un int scris in binar (4 octeti) din streamul de intrare * @return numarul citit * @throws IOException cand s-a produs o eroare la citirea din InputStream-ul incapsulat */ public int readInt() throws IOException { byte [] buf = new byte[4]; while( in.available() < 4 ) try { Thread.currentThread().sleep(1000); } catch (InterruptedException ex) {} in.read(buf, 0, 4); return arr2int(buf); } /** * Citeste un Vector scris in binar (3 double) din streamul de intrare * @return Vectorul citit * @throws IOException cand s-a produs o eroare la citirea din InputStream-ul incapsulat */ public Vector readVector() throws IOException { Vector v = new Vector(); v.x = readDouble(); v.y = readDouble(); v.z = readDouble(); readDouble(); return v; } /** * Citeste un Vector scris in binar (3 float) din streamul de intrare * @return Vectorul citit * @throws IOException cand s-a produs o eroare la citirea din InputStream-ul incapsulat */ public Vector readFloatVector() throws IOException { Vector v = new Vector(); v.x = (double)readFloat(); v.y = (double)readFloat(); v.z = (double)readFloat(); readFloat(); return v; } private int arr2int (byte[] arr) { int i = 0; int len = 4; int cnt = 0; byte[] tmp = new byte[len]; for (i = 0; i < len; i++) { tmp[cnt] = arr[i]; cnt++; } int accum = 0; i = 0; for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ) { accum |= ( (int)( tmp[i] & 0xff ) ) << shiftBy; i++; } return accum; } private double arr2float (byte[] arr, int start) { int i = 0; int len = 4; int cnt = 0; byte[] tmp = new byte[len]; for (i = start; i < (start + len); i++) { tmp[cnt] = arr[i]; cnt++; } int accum = 0; i = 0; for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ) { accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy; i++; } return Float.intBitsToFloat(accum); } private double arr2double (byte[] arr, int start) { int i = 0; int len = 8; int cnt = 0; byte[] tmp = new byte[len]; for (i = start; i < (start + len); i++) { tmp[cnt] = arr[i]; cnt++; } long accum = 0; i = 0; for ( int shiftBy = 0; shiftBy < 64; shiftBy += 8 ) { accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy; i++; } return Double.longBitsToDouble(accum); } }