Jim,
You neglected to mention whether you're using the C++ backend or the Java
one. Regardless, I think I've found your problem:
> static def getDouble( reader: FileReader ) : Double throws
IOException {
> val byte0 = reader.read(); Console.OUT.printf(" %X\t", byte0);
^^^^^^^^^
The inferred type of byte0 is Int (since that's what reader.read()
returns).
> val ret1 = ( ((byte7&0xff)<<56) | ((byte6&0xff)<<48) |
((byte5&0xff)<<40) | ((byte4 & 0xff)<<32) );
^^^^^^^^
Ditto for the inferred type of ret1 (since the whole expression is using
Ints).
> return Double.fromLongBits((ret0|ret1) as Long);
^^^^^^^
This cast comes too late - the value has already been truncated by this
point.
I think the solution is to explicitly specify the type of byte0 through
byte7 as Long, like this:
> val byte0: Long = reader.read(); Console.OUT.printf(" %X\t",
byte0);
etc.
Any reason you are not using the Marshal approach I suggested earlier?
Igor
Jim LaGrone <[email protected]> wrote on 08/11/2009 09:55:13 PM:
> I am having trouble reading values from a binary file. The file is
> written in LSB order but X10 assumes MSB order. I have written methods
> to compensate for this. The methods for shorts, ints, and floats work,
> but I'm having trouble with the longs and doubles. Here is a test case.
>
> Can someone verify this?
>
> import x10.io.*;
> import x10.io.Console;
>
> class ByteTester {
> public static def main(args: Rail[String] ) {
> val fileName = "double-x10file.bin";
> write(fileName);
>
> //prints two floats -1.2251404E-32, 2.597222
> floatReader(2, fileName);
>
> //should print double 1.111111100000000e+01 (or equiv)
> doubleReader(1, fileName);
> return;
> }
>
> static def floatReader(n :Int, fileName: String ){
> var reader: FileReader;
> var i: Int = 0;
> try{
> reader = new FileReader( new File(fileName) );
> for ( i = 0; i < n; i++ ){
> val value = getFloat(reader);
> Console.OUT.println( " -->\t" + value );
> }
> reader.close();
> }catch(e:Exception){
> Console.OUT.println("OOOPS!!");
> e.printStackTrace();
> }
> return i;
> }
>
> static def doubleReader(n :Int, fileName: String ){
> var reader: FileReader;
> var i: Int = 0;
> try{
> reader = new FileReader( new File(fileName) );
> for ( i = 0; i < n; i++ ){
> val value = getDouble(reader);
> Console.OUT.println( " -->\t" + value );
> }
> reader.close();
> }catch(e:Exception){
> Console.OUT.println("OOOPS!!");
> e.printStackTrace();
> }
> return i;
> }
>
> /*writes 8 bytes*/
> public static def write(fileName: String){
> try{
> var writer:FileWriter = new FileWriter( new File(fileName));
> writer.writeByte(0xa3 as byte);
> writer.writeByte(0x73 as byte);
> writer.writeByte(0x7e as byte);
> writer.writeByte(0x8a as byte);
>
> writer.writeByte(0xe3 as byte);
> writer.writeByte(0x38 as byte);
> writer.writeByte(0x26 as byte);
> writer.writeByte(0x40 as byte);
> writer.close();
> }catch(e:Exception){
> Console.OUT.println("OOOPS!!");
> e.printStackTrace();
> }
> }
>
> /* reads 8 bytes in MSB and converts to LSB incorrectly */
> static def getDouble( reader: FileReader ) : Double throws
> IOException {
> val byte0 = reader.read(); Console.OUT.printf(" %X\t", byte0);
> val byte1 = reader.read(); Console.OUT.printf(" %X\t", byte1);
> val byte2 = reader.read(); Console.OUT.printf(" %X\t", byte2);
> val byte3 = reader.read(); Console.OUT.printf(" %X\t", byte3);
> val byte4 = reader.read(); Console.OUT.printf(" %X\t", byte4);
> val byte5 = reader.read(); Console.OUT.printf(" %X\t", byte5);
> val byte6 = reader.read(); Console.OUT.printf(" %X\t", byte6);
> val byte7 = reader.read(); Console.OUT.printf(" %X\t", byte7);
>
> val ret1 = ( ((byte7&0xff)<<56) | ((byte6&0xff)<<48) |
> ((byte5&0xff)<<40) | ((byte4 & 0xff)<<32) );
> val ret0 = ( ((byte3&0xff)<<24) | ((byte2&0xff)<<16) |
> ((byte1&0xff)<<8) | (byte0 & 0xff) );
> return Double.fromLongBits((ret0|ret1) as Long);
> }
>
> /* reads 4 bytes in MSB and converts to LSB correctly */
> static def getFloat( reader: FileReader ) :Float throws IOException {
> val byte0 = reader.read(); Console.OUT.printf(" %X \t",byte0);
> val byte1 = reader.read(); Console.OUT.printf(" %X \t",byte1);
> val byte2 = reader.read(); Console.OUT.printf(" %X \t",byte2);
> val byte3 = reader.read(); Console.OUT.printf(" %X \t",byte3);
> val ret = ( ((byte3&0xff)<<24) | ((byte2&0xff)<<16) |
> ((byte1&0xff)<<8) | (byte0 & 0xff) );
> return Float.fromIntBits(ret);
> }
> }
--
Igor Peshansky (note the spelling change!)
IBM T.J. Watson Research Center
XJ: No More Pain for XML's Gain (http://www.research.ibm.com/xj/)
X10: Parallel Productivity and Performance (http://x10.sf.net/)
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
X10-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/x10-users