content: package fuzion24.device.vulnerability.vulnerabilities.helper;
  
  import android.content.Context;
  import android.content.res.AssetManager;
  import android.util.Log;
  
  import java.io.ByteArrayOutputStream;
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.zip.ZipEntry;
  import java.util.zip.ZipInputStream;
  
  public class BinaryAssets {
  
      private static final String TAG = BinaryAssets.class.getSimpleName();
  
      public static void extractAsset(Context ctx, String name, String destination) throws IOException {
          extractAsset(ctx, name, destination, true);
      }
  
      public static String extractAsset(Context ctx, String name) throws IOException {
          AssetManager assetManager = ctx.getAssets();
          InputStream asset = assetManager.open(name);
          ByteArrayOutputStream fos = new ByteArrayOutputStream();
          copy(asset, fos);
          return fos.toString();
      }
  
      public static void extractAsset(Context ctx, String name, String destination, boolean overwrite) throws IOException {
          Log.d(TAG, "Extracting \'" + name + "\' from assets to \'" + destination + "\' ...");
  
          try {
              File f = new File(destination);
              if(f.exists() && overwrite) {
                  f.delete();
              }
          }
  
          catch(Exception e) {e.printStackTrace();}
  
          AssetManager assetManager = ctx.getAssets();
          InputStream asset = assetManager.open(name);
          FileOutputStream fos = new FileOutputStream(destination);
          copy(asset,fos);
      }
  
      public static void extractZipAsset(Context ctx, String zipAsset, String destination) throws IOException {
          AssetManager assetManager = ctx.getAssets();
          InputStream asset = assetManager.open(zipAsset);
          ZipInputStream zis = new ZipInputStream(asset);
  
          File extractionDir = new File(destination);
  
          boolean directionCreationSucceeded = extractionDir.mkdirs();
  
          ZipEntry ze = null;
          byte[] buffer = new byte[8192];
          while ((ze = zis.getNextEntry()) != null) {
  
              if(ze.isDirectory()){
                  continue;
              }
  
              //Strip everything from the last '/'
              String zeName = ze.getName();
              String fileName = zeName;
              if(zeName.lastIndexOf('/') != -1){
                  fileName = zeName.substring(zeName.lastIndexOf('/'), zeName.length());
              }
  
              String fileExtractionPath = destination + fileName;
              FileOutputStream fos = new FileOutputStream(fileExtractionPath);
              int len;
              while ((len = zis.read(buffer)) != -1) {
                  fos.write(buffer, 0, len);
              }
              fos.close();
          }
      }
  
      private static final int BUFFER_SIZE = 2 * 1024 * 1024;
      public static void copy(InputStream input, OutputStream output) throws IOException {
          try {
              byte[] buffer = new byte[BUFFER_SIZE];
              int bytesRead = input.read(buffer);
              while (bytesRead != -1) {
                  output.write(buffer, 0, bytesRead);
                  bytesRead = input.read(buffer);
              }
              //If needed, close streams.
          } finally {
              input.close();
              output.close();
          }
      }
  }
  