# File lib/numru/nusdas.rb, line 1338
    def unpack_data(str, x, nx, y, ny, pakking, missing, size)
      case pakking.rstrip
      when "1PAC", "I1"
        natype = NArray::BYTE
        byte = 1
        type = "I1"
      when "2PAC", "2UPC", "N1I2", "I2"
        natype = NArray::SINT
        byte = 2
        type = "I2"
      when "4PAC", "I4"
        natype = NArray::INT
        byte = 4
        type = "I4"
      when "R4"
        natype = NArray::SFLOAT
        byte = 4
        type = "R4"
      when "R8"
        natype = NArray::DFLOAT
        byte = 8
        type = "R8"
      when "RLEN"
        raise "sorry, not suported"
      else
        raise "pakking is invalid"
      end
      case missing
      when "UDFV"
        mstr = str[0,byte]
        str = str[byte..-1]
        case type
        when "I1"
          miss = mstr.unpack("C")[0]
        when "I2"
          if pakking == "2UPC"
            miss = mstr.unpack("n")[0]
          else
            miss = get_sint2(mstr)
          end
        when "I4"
          miss = get_sint4(mstr)
        when "R4"
          miss = mstr.unpack("g")[0]
        when "R8"
          miss = mstr.unpack("G")[0]
        else
          raise "bug"
        end
      when "MASK"
        len = size[0]*size[1]
        n = (len-1)/8+1
        mstr = str[0,n]
        mask = NArray.byte(len)
        mask[true] = mstr.unpack("B*")[0][0,len].unpack("c*")
        mask -= 48
        str = str[n..-1]
      when "NONE"
        # do nothing
      else
        raise "missing is invalid"
      end

      case pakking
      when "1PAC", "2PAC", "2UPC"
        b = str[0,4].unpack("g")[0]
        a = str[4,4].unpack("g")[0]
        str = str[8..-1]
      when "4PAC"
        b = str[0,8].unpack("G")[0]
        a = str[8,8].unpack("G")[0]
        str = str[16..-1]
      when "RLEN"
        nbit = str[0,4].unpack("N")[0]
        maxv = str[4,4].unpack("N")[0]
        num = str[8,4].unpack("N")[0]
        str = [12,(nbit*num-1)/8+1]
      end

      if missing == "MASK"
        ary = endian( NArray.to_na(str, natype) )
      else
        ary = endian( NArray.to_na(slice(str,x,nx,y,ny,size,byte), natype) )
      end

      if missing == "UDFV"
        mask = ary.ne(miss)
      end

      case pakking
      when "1PAC", "2PAC", "2UPC"
        ary = ary.to_type(NArray::SFLOAT)
        if pakking == "2UPC"
          ma = ary.lt(0)
          ary[ma] = 65536 + ary[ma]
        end
        ary *= a
        ary += b
      when "4PAC"
        ary = ary.to_type(NArray::DFLOAT)
        ary *= a
        ary += b
      when "N1I2"
        ary = ary.to_type(NArray::SFLOAT)
        ary /= 10
      when "RLEN"
        # still undefined
        error
      end

      case missing
      when "UDFV"
        ary = NArrayMiss.to_nam_no_dup(ary, mask)
      when "MASK"
        ary2 = NArray.new(natype, size[0]*size[1])
        ary2[mask] = ary
        ary = NArrayMiss.to_nam_no_dup(ary2, mask)
        x = Integer === x ? x..(x+nx-1) : x
        y = Integer === y ? y..(y+ny-1) : y
        ary.reshape!(size[0], size[1])
        ary = ary[x,y]
      end

      ary.reshape!(nx, ny)

      return ary
    end