cdm/src/main/java/ucar/nc2/iosp/nowrad/NOWRadheader.java
void read(ucar.unidata.io.RandomAccessFile raf, ucar.nc2.NetcdfFile ncfile) throws Exception {
        this.raf = raf;

        int rc;    /* function return status */
        int hoffset;
        int readLen = 250;

        this.ncfile = ncfile;

        int pos = 0;

        raf.seek(pos);

        byte[] b = new byte[readLen];

        rc = raf.read(b);

        if (rc != readLen) {
            log.warn(" error reading nids product header " + raf.getLocation());
        }

        int    hsize   = b[3];
        String product = new String(b, 15, 8, CDM.utf8Charset);

        // image lines
        //byte[] bt   = new byte[] { (byte) 0xF0, (byte) 0x0A };
        int    t1 = 0  ;
        int ii = 0;
        for(int i = 0; i < readLen; i++ ){
            if(convertunsignedByte2Short(b[i+hsize]) == 0xF0 &&
                     convertunsignedByte2Short(b[i+1+hsize]) == 0x0A ){
                t1 = i + hsize;
                ii = i;
                break;
            }
        }
        if(t1 == 0)
            return;
        // if(convertunsignedByte2Short(b[6+hsize]) != 0xF0 ||
        // convertunsignedByte2Short(b[7+hsize]) != 0x0A )
        // return;
        String lstr = trim(new String(b, t1 + 2, 4, CDM.utf8Charset));

        numY = Integer.parseInt(lstr);

        String estr = trim(new String(b, t1 + 6, 5, CDM.utf8Charset));

        numX = Integer.parseInt(estr);
        //bt   = new byte[] { (byte) 0xF0, (byte) 0x03 };

        t1   = 0;
        for(int i = ii; i < readLen; i++ ){
            if(convertunsignedByte2Short(b[i+hsize]) == 0xF0 &&
                    convertunsignedByte2Short(b[i+1+hsize]) == 0x03 ){
                t1 = i + hsize;
                ii = i;
                break;
            }
        }
        if(t1 == 0)
            return;
        // if((lstr.length()+estr.length() < 8))
        // hsize = hsize -2;

        // if(convertunsignedByte2Short(b[18+hsize]) != 0xF0 ||
        // convertunsignedByte2Short(b[19+hsize]) != 0x03 )
        // return;
        int    off = 0;

        if (product.contains("USRADHF")) {
            off = 3;
        }

        // Image time, HHMMSS.  The time will be in the form HH:MM, so look :
        String ts = new String(b, t1 + 22 + off, 2, CDM.utf8Charset);
        int    hr = Integer.parseInt(ts);

        ts = new String(b, t1 + 25 + off, 2, CDM.utf8Charset);

        int min = Integer.parseInt(ts);

        ts = new String(b, t1 + 28 + off, 2, CDM.utf8Charset);

        int dd = Integer.parseInt(ts);

        ts = new String(b, t1 + 31 + off, 3, CDM.utf8Charset);

        String mon   = ts;
        int    month = getMonth(mon);

        ts = new String(b, t1 + 35 + off, 2, CDM.utf8Charset);

        int              year = Integer.parseInt(ts);
        SimpleDateFormat sdf  = new SimpleDateFormat();

        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        sdf.applyPattern("yyyy/MM/dd HH:mm");

        Date   date = sdf.parse(year + "/" + month + "/" + dd + " " + hr + ":" + min);

        //bt = new byte[] { (byte) 0xF0, (byte) 0x0b };
        t1 = 0;

        for(int i = ii; i < readLen; i++ ){
            if(convertunsignedByte2Short(b[i+hsize]) == 0xF0 &&
                    convertunsignedByte2Short(b[i+1+hsize]) == 0x0b ) {
                t1 = i + hsize;
                break;
            }
        }
        if(t1 == 0)
            return;
        // if( convertunsignedByte2Short(b[101 + hsize]) != 0xF0 ||
        // convertunsignedByte2Short(b[102 + hsize]) != 0x0b )
        // return;
        if (product.contains("NOWRAD")) {
            String ot = new String(b, t1 + 2, 68, CDM.utf8Charset);

            //List<String> toks = StringUtil.split(ot, " ", true, true);
            String[] toks = StringUtil2.splitString(ot);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks[1]));    // lon
            double       nav2 = Math.toDegrees(Double.parseDouble(toks[2]));    // lat
            double       nav3 = Math.toDegrees(Double.parseDouble(toks[3]));
            double       nav4 = Math.toDegrees(Double.parseDouble(toks[4]));    // lat sp
            double       nav5 = Math.toDegrees(Double.parseDouble(toks[5]));    // lon sp

            // lower left and upper right corner
            float rlat1;
            float rlon1;
            float rlat2;
            float rlon2;

            rlat1   = (float) (nav2 - (numY - 1) * nav4);
            rlon1   = (float) (nav1 + nav3);
            rlat2   = (float) nav2;
            rlon2   = (float) (nav1 - nav3);
            hoffset = t1 + 71;    // 172 + hsize;

            // start of the image sequence
            if ((convertunsignedByte2Short(b[172 + hsize]) != 0xF0)
                    || (convertunsignedByte2Short(b[173 + hsize]) != 0x0c)) {
                return;
            }

            // hoffset = 174 + hsize;
            // Set product-dependent information
            setProductInfo(product, date);

            // data struct
            nowrad(hoffset, rlat1, rlon1, rlat2, rlon2, (float) nav4, (float) nav5, date);
        } else if (product.contains("USRADHF")) {
            String ot = new String(b, t1 + 2, 107, CDM.utf8Charset);

            String[] toks = StringUtil2.splitString(ot);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks[1]));    // standard lat 1
            double       nav2 = Math.toDegrees(Double.parseDouble(toks[2]));    // standard lat 2
            double       nav3 = Math.toDegrees(Double.parseDouble(toks[3]));    // lat. center of proj
            double       nav4 = Math.toDegrees(Double.parseDouble(toks[4]));    // lon. center of proj
            double       nav5 = Math.toDegrees(Double.parseDouble(toks[5]));    // upper left lat
            double       nav6 = Math.toDegrees(Double.parseDouble(toks[6]));    // upper left lon

            /* List<String> toks = StringUtil.split(ot, " ", true, true);
            String       pj   = toks.get(0);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks.get(1)));    // standard lat 1
            double       nav2 = Math.toDegrees(Double.parseDouble(toks.get(2)));    // standard lat 2
            double       nav3 = Math.toDegrees(Double.parseDouble(toks.get(3)));    // lat. center of proj
            double       nav4 = Math.toDegrees(Double.parseDouble(toks.get(4)));    // lon. center of proj
            double       nav5 = Math.toDegrees(Double.parseDouble(toks.get(5)));    // upper left lat
            double       nav6 = Math.toDegrees(Double.parseDouble(toks.get(6)));    // upper left lon
            double       nav7 = Math.toDegrees(Double.parseDouble(toks.get(7)));    // lat sp
            double       nav8 = Math.toDegrees(Double.parseDouble(toks.get(8)));    // lon sp  */

            // lower left and upper right corner
            // int offh = 39;
            hoffset = t1 + 110;    // 172 + hsize+ offh;

            // start of the image sequence
            if ((convertunsignedByte2Short(b[t1 + 110]) != 0xF0) || (convertunsignedByte2Short(b[t1 + 111]) != 0x0c)) {
                return;
            }

            // Set product-dependent information
            setProductInfo(product, date);

            // data struct
            nowradL(hoffset, (float) nav1, (float) nav2, (float) nav3, (float) nav4, (float) nav5, (float) nav6, date);
        }


        ncfile.finish();
    }
void read(ucar.unidata.io.RandomAccessFile raf, ucar.nc2.NetcdfFile ncfile) throws Exception {
        this.raf = raf;

        int rc;    /* function return status */
        int hoffset;
        int readLen = 250;

        this.ncfile = ncfile;

        int pos = 0;

        raf.seek(pos);

        byte[] b = new byte[readLen];

        rc = raf.read(b);

        if (rc != readLen) {
            log.warn(" error reading nids product header " + raf.getLocation());
        }

        int    hsize   = b[3];
        String product = new String(b, 15, 8, CDM.utf8Charset);

        // image lines
        //byte[] bt   = new byte[] { (byte) 0xF0, (byte) 0x0A };
        int    t1 = 0  ;
        int ii = 0;
        for(int i = 0; i < readLen; i++ ){
            if(convertunsignedByte2Short(b[i+hsize]) == 0xF0 &&
                     convertunsignedByte2Short(b[i+1+hsize]) == 0x0A ){
                t1 = i + hsize;
                ii = i;
                break;
            }
        }
        if(t1 == 0)
            return;
        // if(convertunsignedByte2Short(b[6+hsize]) != 0xF0 ||
        // convertunsignedByte2Short(b[7+hsize]) != 0x0A )
        // return;
        String lstr = trim(new String(b, t1 + 2, 4, CDM.utf8Charset));

        numY = Integer.parseInt(lstr);

        String estr = trim(new String(b, t1 + 6, 5, CDM.utf8Charset));

        numX = Integer.parseInt(estr);
        //bt   = new byte[] { (byte) 0xF0, (byte) 0x03 };

        t1   = 0;
        for(int i = ii; i < readLen; i++ ){
            if(convertunsignedByte2Short(b[i+hsize]) == 0xF0 &&
                    convertunsignedByte2Short(b[i+1+hsize]) == 0x03 ){
                t1 = i + hsize;
                ii = i;
                break;
            }
        }
        if(t1 == 0)
            return;
        // if((lstr.length()+estr.length() < 8))
        // hsize = hsize -2;

        // if(convertunsignedByte2Short(b[18+hsize]) != 0xF0 ||
        // convertunsignedByte2Short(b[19+hsize]) != 0x03 )
        // return;
        int    off = 0;

        if (product.contains("USRADHF")) {
            off = 3;
        }

        // Image time, HHMMSS.  The time will be in the form HH:MM, so look :
        String ts = new String(b, t1 + 22 + off, 2, CDM.utf8Charset);
        int    hr = Integer.parseInt(ts);

        ts = new String(b, t1 + 25 + off, 2, CDM.utf8Charset);

        int min = Integer.parseInt(ts);

        ts = new String(b, t1 + 28 + off, 2, CDM.utf8Charset);

        int dd = Integer.parseInt(ts);

        ts = new String(b, t1 + 31 + off, 3, CDM.utf8Charset);

        String mon   = ts;
        int    month = getMonth(mon);

        ts = new String(b, t1 + 35 + off, 2, CDM.utf8Charset);

        int              year = Integer.parseInt(ts);
        SimpleDateFormat sdf  = new SimpleDateFormat();

        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        sdf.applyPattern("yyyy/MM/dd HH:mm");

        Date   date = sdf.parse(year + "/" + month + "/" + dd + " " + hr + ":" + min);

        //bt = new byte[] { (byte) 0xF0, (byte) 0x0b };
        t1 = 0;

        for(int i = ii; i < readLen; i++ ){
            if(convertunsignedByte2Short(b[i+hsize]) == 0xF0 &&
                    convertunsignedByte2Short(b[i+1+hsize]) == 0x0b ) {
                t1 = i + hsize;
                break;
            }
        }
        if(t1 == 0)
            return;
        // if( convertunsignedByte2Short(b[101 + hsize]) != 0xF0 ||
        // convertunsignedByte2Short(b[102 + hsize]) != 0x0b )
        // return;
        if (product.contains("NOWRAD")) {
            String ot = new String(b, t1 + 2, 68, CDM.utf8Charset);

            //List<String> toks = StringUtil.split(ot, " ", true, true);
            String[] toks = StringUtil2.splitString(ot);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks[1]));    // lon
            double       nav2 = Math.toDegrees(Double.parseDouble(toks[2]));    // lat
            double       nav3 = Math.toDegrees(Double.parseDouble(toks[3]));
            double       nav4 = Math.toDegrees(Double.parseDouble(toks[4]));    // lat sp
            double       nav5 = Math.toDegrees(Double.parseDouble(toks[5]));    // lon sp

            // lower left and upper right corner
            float rlat1;
            float rlon1;
            float rlat2;
            float rlon2;

            rlat1   = (float) (nav2 - (numY - 1) * nav4);
            rlon1   = (float) (nav1 + nav3);
            rlat2   = (float) nav2;
            rlon2   = (float) (nav1 - nav3);
            hoffset = t1 + 71;    // 172 + hsize;

            // start of the image sequence
            if ((convertunsignedByte2Short(b[172 + hsize]) != 0xF0)
                    || (convertunsignedByte2Short(b[173 + hsize]) != 0x0c)) {
                return;
            }

            // hoffset = 174 + hsize;
            // Set product-dependent information
            setProductInfo(product, date);

            // data struct
            nowrad(hoffset, rlat1, rlon1, rlat2, rlon2, (float) nav4, (float) nav5, date);
        } else if (product.contains("USRADHF")) {
            String ot = new String(b, t1 + 2, 107, CDM.utf8Charset);

            String[] toks = StringUtil2.splitString(ot);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks[1]));    // standard lat 1
            double       nav2 = Math.toDegrees(Double.parseDouble(toks[2]));    // standard lat 2
            double       nav3 = Math.toDegrees(Double.parseDouble(toks[3]));    // lat. center of proj
            double       nav4 = Math.toDegrees(Double.parseDouble(toks[4]));    // lon. center of proj
            double       nav5 = Math.toDegrees(Double.parseDouble(toks[5]));    // upper left lat
            double       nav6 = Math.toDegrees(Double.parseDouble(toks[6]));    // upper left lon

            /* List<String> toks = StringUtil.split(ot, " ", true, true);
            String       pj   = toks.get(0);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks.get(1)));    // standard lat 1
            double       nav2 = Math.toDegrees(Double.parseDouble(toks.get(2)));    // standard lat 2
            double       nav3 = Math.toDegrees(Double.parseDouble(toks.get(3)));    // lat. center of proj
            double       nav4 = Math.toDegrees(Double.parseDouble(toks.get(4)));    // lon. center of proj
            double       nav5 = Math.toDegrees(Double.parseDouble(toks.get(5)));    // upper left lat
            double       nav6 = Math.toDegrees(Double.parseDouble(toks.get(6)));    // upper left lon
            double       nav7 = Math.toDegrees(Double.parseDouble(toks.get(7)));    // lat sp
            double       nav8 = Math.toDegrees(Double.parseDouble(toks.get(8)));    // lon sp  */

            // lower left and upper right corner
            // int offh = 39;
            hoffset = t1 + 110;    // 172 + hsize+ offh;

            // start of the image sequence
            if ((convertunsignedByte2Short(b[t1 + 110]) != 0xF0) || (convertunsignedByte2Short(b[t1 + 111]) != 0x0c)) {
                return;
            }

            // Set product-dependent information
            setProductInfo(product, date);

            // data struct
            nowradL(hoffset, (float) nav1, (float) nav2, (float) nav3, (float) nav4, (float) nav5, (float) nav6, date);
        }


        ncfile.finish();
    }
void read ( ucar . unidata . io . RandomAccessFile raf , ucar . nc2 . NetcdfFile ncfile ) throws Exception { this . raf = raf ; int rc ; /* function return status */ int hoffset ; int readLen = 250 ; this . ncfile = ncfile ; int pos = 0 ; raf . seek ( pos ) ; byte [ ] b = new byte [ readLen ] ; rc = raf . read ( b ) ; if ( rc != readLen ) { log . warn ( " error reading nids product header " + raf . getLocation ( ) ) ; } int hsize = b [ 3 ] ; String product = new String ( b , 15 , 8 , CDM . utf8Charset ) ; // image lines
 //byte[] bt   = new byte[] { (byte) 0xF0, (byte) 0x0A };
 int t1 = 0 ; int ii = 0 ; for ( int i = 0 ; i < readLen ; i ++ ) { if ( convertunsignedByte2Short ( b [ i + hsize ] ) == 0xF0 && convertunsignedByte2Short ( b [ i + 1 + hsize ] ) == 0x0A ) { t1 = i + hsize ; ii = i ; break ; } } if ( t1 == 0 ) return ; // if(convertunsignedByte2Short(b[6+hsize]) != 0xF0 ||
 // convertunsignedByte2Short(b[7+hsize]) != 0x0A )
 // return;
 String lstr = trim ( new String ( b , t1 + 2 , 4 , CDM . utf8Charset ) ) ; numY = Integer . parseInt ( lstr ) ; String estr = trim ( new String ( b , t1 + 6 , 5 , CDM . utf8Charset ) ) ; numX = Integer . parseInt ( estr ) ; //bt   = new byte[] { (byte) 0xF0, (byte) 0x03 };
 t1 = 0 ; for ( int i = ii ; i < readLen ; i ++ ) { if ( convertunsignedByte2Short ( b [ i + hsize ] ) == 0xF0 && convertunsignedByte2Short ( b [ i + 1 + hsize ] ) == 0x03 ) { t1 = i + hsize ; ii = i ; break ; } } if ( t1 == 0 ) return ; // if((lstr.length()+estr.length() < 8))
 // hsize = hsize -2;
 // if(convertunsignedByte2Short(b[18+hsize]) != 0xF0 ||
 // convertunsignedByte2Short(b[19+hsize]) != 0x03 )
 // return;
 int off = 0 ; if ( product . contains ( "USRADHF" ) ) { off = 3 ; } // Image time, HHMMSS.  The time will be in the form HH:MM, so look :
 String ts = new String ( b , t1 + 22 + off , 2 , CDM . utf8Charset ) ; int hr = Integer . parseInt ( ts ) ; ts = new String ( b , t1 + 25 + off , 2 , CDM . utf8Charset ) ; int min = Integer . parseInt ( ts ) ; ts = new String ( b , t1 + 28 + off , 2 , CDM . utf8Charset ) ; int dd = Integer . parseInt ( ts ) ; ts = new String ( b , t1 + 31 + off , 3 , CDM . utf8Charset ) ; String mon = ts ; int month = getMonth ( mon ) ; ts = new String ( b , t1 + 35 + off , 2 , CDM . utf8Charset ) ; int year = Integer . parseInt ( ts ) ; SimpleDateFormat sdf = new SimpleDateFormat ( ) ; sdf . setTimeZone ( TimeZone . getTimeZone ( "GMT" ) ) ; sdf . applyPattern ( "yyyy/MM/dd HH:mm" ) ; Date date = sdf . parse ( year + "/" + month + "/" + dd + " " + hr + ":" + min ) ; //bt = new byte[] { (byte) 0xF0, (byte) 0x0b };
 t1 = 0 ; for ( int i = ii ; i < readLen ; i ++ ) { if ( convertunsignedByte2Short ( b [ i + hsize ] ) == 0xF0 && convertunsignedByte2Short ( b [ i + 1 + hsize ] ) == 0x0b ) { t1 = i + hsize ; break ; } } if ( t1 == 0 ) return ; // if( convertunsignedByte2Short(b[101 + hsize]) != 0xF0 ||
 // convertunsignedByte2Short(b[102 + hsize]) != 0x0b )
 // return;
 if ( product . contains ( "NOWRAD" ) ) { String ot = new String ( b , t1 + 2 , 68 , CDM . utf8Charset ) ; //List<String> toks = StringUtil.split(ot, " ", true, true);
 String [ ] toks = StringUtil2 . splitString ( ot ) ; double nav1 = Math . toDegrees ( Double . parseDouble ( toks [ 1 ] ) ) ; // lon
 double nav2 = Math . toDegrees ( Double . parseDouble ( toks [ 2 ] ) ) ; // lat
 double nav3 = Math . toDegrees ( Double . parseDouble ( toks [ 3 ] ) ) ; double nav4 = Math . toDegrees ( Double . parseDouble ( toks [ 4 ] ) ) ; // lat sp
 double nav5 = Math . toDegrees ( Double . parseDouble ( toks [ 5 ] ) ) ; // lon sp
 // lower left and upper right corner
 float rlat1 ; float rlon1 ; float rlat2 ; float rlon2 ; rlat1 = ( float ) ( nav2 - ( numY - 1 ) * nav4 ) ; rlon1 = ( float ) ( nav1 + nav3 ) ; rlat2 = ( float ) nav2 ; rlon2 = ( float ) ( nav1 - nav3 ) ; hoffset = t1 + 71 ; // 172 + hsize;
 // start of the image sequence
 if ( ( convertunsignedByte2Short ( b [ 172 + hsize ] ) != 0xF0 ) || ( convertunsignedByte2Short ( b [ 173 + hsize ] ) != 0x0c ) ) { return ; } // hoffset = 174 + hsize;
 // Set product-dependent information
 setProductInfo ( product , date ) ; // data struct
 nowrad ( hoffset , rlat1 , rlon1 , rlat2 , rlon2 , ( float ) nav4 , ( float ) nav5 , date ) ; } else if ( product . contains ( "USRADHF" ) ) { String ot = new String ( b , t1 + 2 , 107 , CDM . utf8Charset ) ; String [ ] toks = StringUtil2 . splitString ( ot ) ; double nav1 = Math . toDegrees ( Double . parseDouble ( toks [ 1 ] ) ) ; // standard lat 1
 double nav2 = Math . toDegrees ( Double . parseDouble ( toks [ 2 ] ) ) ; // standard lat 2
 double nav3 = Math . toDegrees ( Double . parseDouble ( toks [ 3 ] ) ) ; // lat. center of proj
 double nav4 = Math . toDegrees ( Double . parseDouble ( toks [ 4 ] ) ) ; // lon. center of proj
 double nav5 = Math . toDegrees ( Double . parseDouble ( toks [ 5 ] ) ) ; // upper left lat
 double nav6 = Math . toDegrees ( Double . parseDouble ( toks [ 6 ] ) ) ; // upper left lon
 /* List<String> toks = StringUtil.split(ot, " ", true, true);
            String       pj   = toks.get(0);
            double       nav1 = Math.toDegrees(Double.parseDouble(toks.get(1)));    // standard lat 1
            double       nav2 = Math.toDegrees(Double.parseDouble(toks.get(2)));    // standard lat 2
            double       nav3 = Math.toDegrees(Double.parseDouble(toks.get(3)));    // lat. center of proj
            double       nav4 = Math.toDegrees(Double.parseDouble(toks.get(4)));    // lon. center of proj
            double       nav5 = Math.toDegrees(Double.parseDouble(toks.get(5)));    // upper left lat
            double       nav6 = Math.toDegrees(Double.parseDouble(toks.get(6)));    // upper left lon
            double       nav7 = Math.toDegrees(Double.parseDouble(toks.get(7)));    // lat sp
            double       nav8 = Math.toDegrees(Double.parseDouble(toks.get(8)));    // lon sp  */ // lower left and upper right corner
 // int offh = 39;
 hoffset = t1 + 110 ; // 172 + hsize+ offh;
 // start of the image sequence
 if ( ( convertunsignedByte2Short ( b [ t1 + 110 ] ) != 0xF0 ) || ( convertunsignedByte2Short ( b [ t1 + 111 ] ) != 0x0c ) ) { return ; } // Set product-dependent information
 setProductInfo ( product , date ) ; // data struct
 nowradL ( hoffset , ( float ) nav1 , ( float ) nav2 , ( float ) nav3 , ( float ) nav4 , ( float ) nav5 , ( float ) nav6 , date ) ; } ncfile . finish ( ) ; }
read and parse the header of the nids/tdwr file
@param raf       input file
@param ncfile    output file
@throws IOException
read and parse the header of the nids / tdwr file