package com.xjf.repository.utils; import android.content.Context; 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.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; /** * <pre> * author: Blankj * blog : http://blankj.com * time : 2016/8/13 * desc : 转换相关工具类 * </pre> */ public class ConvertUtils { static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /** * byteArr转hexString * <p>例如:</p> * bytes2HexString(new byte[] { 0, (byte) 0xa8 }) returns 00A8 * * @param bytes byte数组 * @return 16进制大写字符串 */ public static String bytes2HexString(byte[] bytes) { char[] res = new char[bytes.length << 1]; for (int i = 0, j = 0; i < bytes.length; i++) { res[j++] = hexDigits[bytes[i] >>> 4 & 0x0f]; res[j++] = hexDigits[bytes[i] & 0x0f]; } return new String(res); } /** * hexString转byteArr * <p>例如:</p> * hexString2Bytes("00A8") returns { 0, (byte) 0xA8 } * * @param hexString 十六进制字符串 * @return 字节数组 */ public static byte[] hexString2Bytes(String hexString) { int len = hexString.length(); if (len % 2 != 0) { throw new IllegalArgumentException("长度不是偶数"); } char[] hexBytes = hexString.toUpperCase().toCharArray(); byte[] res = new byte[len >>> 1]; for (int i = 0; i < len; i += 2) { res[i >> 1] = (byte) (hex2Dec(hexBytes[i]) << 4 | hex2Dec(hexBytes[i + 1])); } return res; } /** * hexChar转int * * @param hexChar hex单个字节 * @return 0..15 */ private static int hex2Dec(char hexChar) { if (hexChar >= '0' && hexChar <= '9') { return hexChar - '0'; } else if (hexChar >= 'A' && hexChar <= 'F') { return hexChar - 'A' + 10; } else { throw new IllegalArgumentException(); } } /** * charArr转byteArr * * @param chars 字符数组 * @return 字节数组 */ public static byte[] chars2Bytes(char[] chars) { int len = chars.length; byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { bytes[i] = (byte) (chars[i]); } return bytes; } /** * byteArr转charArr * * @param bytes 字节数组 * @return 字符数组 */ public static char[] bytes2Chars(byte[] bytes) { int len = bytes.length; char[] chars = new char[len]; for (int i = 0; i < len; i++) { chars[i] = (char) (bytes[i] & 0xff); } return chars; } /** * inputStream转outputStream * * @param is 输入流 * @return outputStream子类 */ public static ByteArrayOutputStream input2OutputStream(InputStream is) { if (is == null) return null; try { ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] b = new byte[ConstUtils.KB]; int len; while ((len = is.read(b)) != -1) { os.write(b, 0, len); } return os; } catch (IOException e) { e.printStackTrace(); return null; } finally { FileUtils.closeIO(is); } } /** * outputStream转inputStream * * @param out 输出流 * @return inputStream子类 */ public ByteArrayInputStream output2InputStream(OutputStream out) { if (out == null) return null; return new ByteArrayInputStream(((ByteArrayOutputStream) out).toByteArray()); } /** * inputStream转byteArr * * @param is 输入流 * @return 字节数组 */ public static byte[] inputStream2Bytes(InputStream is) { return input2OutputStream(is).toByteArray(); } /** * byteArr转inputStream * * @param bytes 字节数组 * @return 输入流 */ public static InputStream bytes2InputStream(byte[] bytes) { return new ByteArrayInputStream(bytes); } /** * outputStream转byteArr * * @param out 输出流 * @return 字节数组 */ public static byte[] outputStream2Bytes(OutputStream out) { if (out == null) return null; return ((ByteArrayOutputStream) out).toByteArray(); } /** * outputStream转byteArr * * @param bytes 字节数组 * @return 字节数组 */ public static OutputStream bytes2OutputStream(byte[] bytes) { ByteArrayOutputStream os = null; try { os = new ByteArrayOutputStream(); os.write(bytes); return os; } catch (IOException e) { e.printStackTrace(); return null; } finally { FileUtils.closeIO(os); } } /** * inputStream转string按编码 * * @param is 输入流 * @param charsetName 编码格式 * @return 字符串 */ public static String inputStream2String(InputStream is, String charsetName) { if (is == null || StringUtils.isSpace(charsetName)) return null; try { return new String(inputStream2Bytes(is), charsetName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } /** * string转inputStream按编码 * * @param string 字符串 * @param charsetName 编码格式 * @return 输入流 */ public static InputStream string2InputStream(String string, String charsetName) { if (string == null || StringUtils.isSpace(charsetName)) return null; try { return new ByteArrayInputStream(string.getBytes(charsetName)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } /** * outputStream转string按编码 * * @param out 输出流 * @param charsetName 编码格式 * @return 字符串 */ public static String outputStream2String(OutputStream out, String charsetName) { if (out == null) return null; try { return new String(outputStream2Bytes(out), charsetName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } /** * string转outputStream按编码 * * @param string 字符串 * @param charsetName 编码格式 * @return 输入流 */ public static OutputStream string2OutputStream(String string, String charsetName) { if (string == null || StringUtils.isSpace(charsetName)) return null; try { return bytes2OutputStream(string.getBytes(charsetName)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } /** * bitmap转byteArr * * @param bitmap bitmap对象 * @param format 格式 * @return 字节数组 */ public static byte[] bitmap2Bytes(Bitmap bitmap, Bitmap.CompressFormat format) { if (bitmap == null) return null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(format, 100, baos); return baos.toByteArray(); } /** * byteArr转bitmap * * @param bytes 字节数组 * @return bitmap对象 */ public static Bitmap bytes2Bitmap(byte[] bytes) { return (bytes == null || bytes.length == 0) ? null : BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } /** * drawable转bitmap * * @param drawable drawable对象 * @return bitmap对象 */ public static Bitmap drawable2Bitmap(Drawable drawable) { return drawable == null ? null : ((BitmapDrawable) drawable).getBitmap(); } /** * bitmap转drawable * * @param resources resources对象 * @param bitmap bitmap对象 * @return drawable对象 */ public static Drawable bitmap2Drawable(Resources resources, Bitmap bitmap) { return bitmap == null ? null : new BitmapDrawable(resources, bitmap); } /** * drawable转byteArr * * @param drawable drawable对象 * @param format 格式 * @return 字节数组 */ public static byte[] drawable2Bytes(Drawable drawable, Bitmap.CompressFormat format) { return bitmap2Bytes(drawable2Bitmap(drawable), format); } /** * byteArr转drawable * * @param resources resources对象 * @param bytes 字节数组 * @return drawable对象 */ public static Drawable bytes2Drawable(Resources resources, byte[] bytes) { return bitmap2Drawable(resources, bytes2Bitmap(bytes)); } /** * dp转px * * @param context 上下文 * @param dpValue dp值 * @return px值 */ public static int dp2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * px转dp * * @param context 上下文 * @param pxValue px值 * @return dp值 */ public static int px2dp(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * sp转px * * @param context 上下文 * @param spValue sp值 * @return px值 */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } /** * px转sp * * @param context 上下文 * @param pxValue px值 * @return sp值 */ public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } }