visad/src/main/java/ucar/nc2/iosp/gempak/GempakFileReader.java
public float[] DM_UNPK(DMPart part, int[] ibitst) {
    int nparms = part.kparms;
    int nwordp = part.kwordp;
    int npack = (ibitst.length - 1) / nwordp + 1;
    if (npack * nwordp != ibitst.length) {
      //logError("number of packed records not correct");
      // System.out.println("number of packed records not correct: "
      //                   + npack * nwordp + " vs. " + ibitst.length);
      return null;
    }
    float[] data = new float[nparms * npack];
    PackingInfo pkinf = part.packInfo;
    int ir = 0;
    int ii = 0;
    for (int pack = 0; pack < npack; pack++) {
      //
      //  Move bitstring into internal words.  TODO: necessary?
      //
      int[] jdata = new int[nwordp];
      System.arraycopy(ibitst, ii, jdata, 0, nwordp);

      //
      //  Extract each data value.
      //
      for (int idata = 0; idata < nparms; idata++) {

        //
        //  Extract correct bits from words using shift and mask
        //  operations.
        //
        int jbit = pkinf.nbitsc[idata];
        int jsbit = pkinf.isbitc[idata];
        int jshift = 1 - jsbit;
        int jsword = pkinf.iswrdc[idata];
        int jword = jdata[jsword];
        // use >>> to shift avoid carrying sign along
        int mask = mskpat >>> (32 - jbit);
        int ifield = jword >>> Math.abs(jshift);
        ifield = ifield & mask;
        if ((jsbit + jbit - 1) > 32) {
          jword = jdata[jsword + 1];
          jshift = jshift + 32;
          int iword = jword << jshift;
          iword = iword & mask;
          ifield = ifield | iword;
        }
        //
        //  The integer data is now in ifield.  Use the scaling and
        //  offset terms to convert to REAL data.
        //
        if (ifield == pkinf.imissc[idata]) {
          data[ir + idata] = RMISSD;
        } else {
          data[ir + idata] = (ifield + pkinf.koffst[idata])
                  * (float) pkinf.scalec[idata];
        }
      }
      ir += nparms;
      ii += nwordp;
    }
    return data;

  }
public float[] DM_UNPK(DMPart part, int[] ibitst) {
    int nparms = part.kparms;
    int nwordp = part.kwordp;
    int npack = (ibitst.length - 1) / nwordp + 1;
    if (npack * nwordp != ibitst.length) {
      //logError("number of packed records not correct");
      // System.out.println("number of packed records not correct: "
      //                   + npack * nwordp + " vs. " + ibitst.length);
      return null;
    }
    float[] data = new float[nparms * npack];
    PackingInfo pkinf = part.packInfo;
    int ir = 0;
    int ii = 0;
    for (int pack = 0; pack < npack; pack++) {
      //
      //  Move bitstring into internal words.  TODO: necessary?
      //
      int[] jdata = new int[nwordp];
      System.arraycopy(ibitst, ii, jdata, 0, nwordp);

      //
      //  Extract each data value.
      //
      for (int idata = 0; idata < nparms; idata++) {

        //
        //  Extract correct bits from words using shift and mask
        //  operations.
        //
        int jbit = pkinf.nbitsc[idata];
        int jsbit = pkinf.isbitc[idata];
        int jshift = 1 - jsbit;
        int jsword = pkinf.iswrdc[idata];
        int jword = jdata[jsword];
        // use >>> to shift avoid carrying sign along
        int mask = mskpat >>> (32 - jbit);
        int ifield = jword >>> Math.abs(jshift);
        ifield = ifield & mask;
        if ((jsbit + jbit - 1) > 32) {
          jword = jdata[jsword + 1];
          jshift = jshift + 32;
          int iword = jword << jshift;
          iword = iword & mask;
          ifield = ifield | iword;
        }
        //
        //  The integer data is now in ifield.  Use the scaling and
        //  offset terms to convert to REAL data.
        //
        if (ifield == pkinf.imissc[idata]) {
          data[ir + idata] = RMISSD;
        } else {
          data[ir + idata] = (ifield + pkinf.koffst[idata])
                  * (float) pkinf.scalec[idata];
        }
      }
      ir += nparms;
      ii += nwordp;
    }
    return data;

  }
public float [ ] DM_UNPK ( DMPart part , int [ ] ibitst ) { int nparms = part . kparms ; int nwordp = part . kwordp ; int npack = ( ibitst . length - 1 ) / nwordp + 1 ; if ( npack * nwordp != ibitst . length ) { //logError("number of packed records not correct"); // System.out.println("number of packed records not correct: " //                   + npack * nwordp + " vs. " + ibitst.length); return null ; } float [ ] data = new float [ nparms * npack ] ; PackingInfo pkinf = part . packInfo ; int ir = 0 ; int ii = 0 ; for ( int pack = 0 ; pack < npack ; pack ++ ) { // //  Move bitstring into internal words.  TODO: necessary? // int [ ] jdata = new int [ nwordp ] ; System . arraycopy ( ibitst , ii , jdata , 0 , nwordp ) ; // //  Extract each data value. // for ( int idata = 0 ; idata < nparms ; idata ++ ) { // //  Extract correct bits from words using shift and mask //  operations. // int jbit = pkinf . nbitsc [ idata ] ; int jsbit = pkinf . isbitc [ idata ] ; int jshift = 1 - jsbit ; int jsword = pkinf . iswrdc [ idata ] ; int jword = jdata [ jsword ] ; // use >>> to shift avoid carrying sign along int mask = mskpat >>> ( 32 - jbit ) ; int ifield = jword >>> Math . abs ( jshift ) ; ifield = ifield & mask ; if ( ( jsbit + jbit - 1 ) > 32 ) { jword = jdata [ jsword + 1 ] ; jshift = jshift + 32 ; int iword = jword << jshift ; iword = iword & mask ; ifield = ifield | iword ; } // //  The integer data is now in ifield.  Use the scaling and //  offset terms to convert to REAL data. // if ( ifield == pkinf . imissc [ idata ] ) { data [ ir + idata ] = RMISSD ; } else { data [ ir + idata ] = ( ifield + pkinf . koffst [ idata ] ) * ( float ) pkinf . scalec [ idata ] ; } } ir += nparms ; ii += nwordp ; } return data ; }
Unpack an array of packed integers.

@param part   the part with packing info
@param ibitst packed integer bit string
@return unpacked ints as floats
Unpack an array of packed integers .