Android中如何将Base16(十六进制)代码转换为ImageView显示?
问题出在哪?怎么解决?
你这段代码的核心问题是把十六进制字符串当成普通文本转字节数组了——这完全不是正确的解析方式!
举个简单的例子:你字符串里的FF,用getBytes()得到的是两个字符F的字节(UTF-8下是0x46和0x46),但我们实际需要的是单个字节0xFF。这种错误的字节数组,BitmapFactory根本认不出来是图片数据,自然显示不出东西。
正确的实现方式
我们需要先把十六进制字符串解析成它对应的二进制字节数组,再传给BitmapFactory。下面给你两种靠谱的方案:
方案1:手动写解析工具(兼容所有API版本)
写一个通用的十六进制转字节数组方法,不管你的项目最低API是多少都能用:
public static byte[] hexToBytes(String hexStr) { // 先清理字符串里的空格(如果有的话) hexStr = hexStr.replaceAll("\\s", ""); int len = hexStr.length(); byte[] result = new byte[len / 2]; for (int i = 0; i < len; i += 2) { // 每次取两个十六进制字符,转成一个字节 result[i/2] = (byte) ((Character.digit(hexStr.charAt(i), 16) << 4) + Character.digit(hexStr.charAt(i+1), 16)); } return result; }
然后修改你的调用代码:
String photoByte2 = "FFD8FFE000104A46494600010101000000000000FFE2021C4943435...."; byte[] imageBytes = hexToBytes(photoByte2); Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); if (bitmap != null) { img.setImageBitmap(bitmap); } else { // 这里可以加个错误提示,比如图片数据坏了或者不完整 Log.e("ImageLoad", "Failed to decode bitmap from hex string"); }
方案2:用Android内置工具(API 26+)
如果你的项目最低支持Android 8.0(API 26),可以直接用系统自带的android.util.Hex类,省得自己写工具:
String photoByte2 = "FFD8FFE000104A46494600010101000000000000FFE2021C4943435...."; try { byte[] imageBytes = Hex.decode(photoByte2); Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); if (bitmap != null) { img.setImageBitmap(bitmap); } else { Log.e("ImageLoad", "Bitmap decode failed"); } } catch (IllegalArgumentException e) { // 处理十六进制格式错误的情况,比如字符串长度是奇数或者有非法字符 Log.e("HexDecode", "Invalid hex string", e); }
额外提醒
- 确保你的十六进制字符串是完整有效的图片数据(比如JPEG开头是
FFD8),如果字符串本身缺了一部分或者格式不对,BitmapFactory会返回null。 - 一定要加判空处理,避免空指针崩溃。
内容的提问来源于stack exchange,提问作者artaaaw
相关产品推荐
相关产品推荐

