@file:Suppress("unused") package io.legato.kazusa.utils import android.content.res.Resources import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import java.io.BufferedReader import java.io.InputStream import java.io.InputStreamReader import java.text.DecimalFormat import kotlin.math.log10 import kotlin.math.pow /** * 数据类型转换、单位转换 * * @author 李玉江[QQ:1023694760] * @since 2014-4-18 */ @Suppress("MemberVisibilityCanBePrivate") object ConvertUtils { const val GB: Long = 1073741824 const val MB: Long = 1048576 const val KB: Long = 1024 fun toInt(obj: Any): Int { return kotlin.runCatching { Integer.parseInt(obj.toString()) }.getOrDefault(-1) } fun toInt(bytes: ByteArray): Int { var result = 0 var byte: Byte for (i in bytes.indices) { byte = bytes[i] result += (byte.toInt() and 0xFF).shl(8 * i) } return result } fun toFloat(obj: Any): Float { return kotlin.runCatching { java.lang.Float.parseFloat(obj.toString()) }.getOrDefault(-1f) } fun toString(objects: Array, tag: String): String { val sb = StringBuilder() for (`object` in objects) { sb.append(`object`) sb.append(tag) } return sb.toString() } @JvmOverloads fun toBitmap(bytes: ByteArray, width: Int = -1, height: Int = -1): Bitmap? { var bitmap: Bitmap? = null if (bytes.isNotEmpty()) { kotlin.runCatching { val options = BitmapFactory.Options() // 设置让解码器以最佳方式解码 options.inPreferredConfig = null if (width > 0 && height > 0) { options.outWidth = width options.outHeight = height } bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options) bitmap!!.density = 96// 96 dpi } } return bitmap } private fun toDrawable(bitmap: Bitmap?): Drawable? { return if (bitmap == null) null else BitmapDrawable(Resources.getSystem(), bitmap) } fun toDrawable(bytes: ByteArray): Drawable? { return toDrawable(toBitmap(bytes)) } fun formatFileSize(length: Long): String { if (length <= 0) return "0" val units = arrayOf("b", "kb", "M", "G", "T") //计算单位的,原理是利用lg,公式是 lg(1024^n) = nlg(1024),最后 nlg(1024)/lg(1024) = n。 val digitGroups = (log10(length.toDouble()) / log10(1024.0)).toInt() //计算原理是,size/单位值。单位值指的是:比如说b = 1024,KB = 1024^2 return DecimalFormat("#,##0.##").format(length / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups] } @JvmOverloads fun toString(`is`: InputStream, charset: String = "utf-8"): String { val sb = StringBuilder() kotlin.runCatching { val reader = BufferedReader(InputStreamReader(`is`, charset)) while (true) { val line = reader.readLine() if (line == null) { break } else { sb.append(line).append("\n") } } reader.close() `is`.close() } return sb.toString() } } val Int.hexString: String get() = Integer.toHexString(this) fun Int.dpToPx(): Int = this.toFloat().dpToPx().toInt() fun Int.spToPx(): Int = this.toFloat().spToPx().toInt() fun Float.dpToPx(): Float = android.util.TypedValue.applyDimension( android.util.TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics ) fun Float.spToPx(): Float = android.util.TypedValue.applyDimension( android.util.TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics )