Java Base64编码与字符串转换实例及Base64与Bitmap转换教程

版权申诉
5 下载量 6 浏览量 更新于2024-09-11 收藏 46KB PDF 举报
在Java编程中,Base64是一种常见的数据编码格式,用于将二进制数据转换成可打印的ASCII字符序列,以便在网络传输或存储时避免直接使用二进制形式。本文档主要关注两个关键主题:Java Base64位编码与String字符串的相互转换,以及Base64编码与Android Bitmap对象之间的转换。 首先,我们来看如何在Java中实现Base64编码与解码。`Base64Util`类是一个常用的工具类,它包含了必要的常量定义,如Base64字符集大小(BASELENGTH)、查找表长度(LOOKUPLENGTH)等。该类中定义了一系列变量和方法,例如: - `base64Alphabet`数组存储了Base64字符集,包括字母(A-Z, a-z, 0-9, +, /),以及特殊的padding字符('=')。 - `lookUpBase64Alphabet`数组用于查找Base64字符对应的位置。 - `encode()`和`decode()`方法是核心功能,分别实现了Base64编码和解码过程。编码时,将输入的二进制数据分块,每24位(3个字节)转换成6位的Base64字符,不足的位用padding字符填充。解码时则是相反的过程,将Base64字符还原成原始二进制数据。 对于字符串与Base64字符串的转换,例如将一个字符串编码为Base64字符串,可以使用`getBytes()`方法获取原始字符串的字节数组,然后调用`Base64Util.encode()`函数进行编码。同样,如果需要将Base64字符串转换回字符串,先通过`Base64.decode()`得到字节数组,再使用`new String()`构造函数创建新的字符串。 接下来是Base64与Bitmap的转换。在Android开发中,Bitmap通常代表图像数据,而Base64编码可以方便地在网络或文本存储中表示这些图片。当需要将Bitmap对象转换为Base64字符串时,首先要将Bitmap压缩成字节数组,然后进行Base64编码。解码时,先接收Base64字符串,解码成字节数组,再使用` BitmapFactory.decodeByteArray()`方法解析为Bitmap。 以下是一个简化的Base64与Bitmap转换的示例代码片段: ```java // 编码Bitmap到Base64字符串 Bitmap bitmap = ...; // 获取Bitmap对象 byte[] bitmapBytes = bitmap.getCompressedData(Bitmap.CompressFormat.JPEG, 100); // 压缩Bitmap String base64String = Base64Util.encode(bitmapBytes); // 解码Base64字符串回Bitmap byte[] decodedBytes = Base64Util.decode(base64String); Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); ``` 理解和掌握Java的Base64编码与字符串转换、Base64与Bitmap的相互转换,对于处理图像数据在网络或存储中的高效传输至关重要。在实际应用中,确保正确处理编码和解码过程中的边缘情况,比如编码后可能产生的padding字符,以及处理不同格式和质量的Bitmap数据。这不仅可以提升应用程序的性能,还能确保数据的安全性和兼容性。

@Override //说明下面公有函数是从父类mButtonListener继承而来,实际是重写onClick事件响应接口(类似回调)函数 public void onClick(View v) //每次按钮被操作,都会调用本重写的消息回调公有函数 { if (aaa == 2131230819) final Thread thread1 = new Thread() //新开第2个TCP通信线程用来发送-接收用户正式消息(因为安全标准不允许在主APP线程中运行延时网络操作) { @Override //说明下面公有函数是从父类mButtonListener继承而来,重写run()函数就是新创建线程程序部分 public void run() //定义新线程中运行的发送+接收客户正式消息子函数run { AtomicReference<String> serverinfo = new AtomicReference<>(); //新建结构化输入流(字符串)操作对象serverinfo,可被多个线程操作引用 serverinfo.set(new String(buf, 0, length, StandardCharsets.UTF_8)); //获取buf中字节数据,转换结构化字符串(并放在输入流对象serverinfo中) } }; thread1.start(); //*启动thread1通信子线程* String base64String = "" 将Base64编码字符串解码成Bitmap图片(对象) String outputStr = ""; if (base64String.contains("data:image/png;base64,")) { 移除前缀 voutputStr = base64String.replace("data:image/png;base64,", ""); //去除指定前缀 } byte[] decodedString = Base64.decode(base64String, Base64.DEFAULT); 显示字符个数 textdx1.setText("字符个数为:" + base64String.length() + ",已经移除前缀: "+ base64String); Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); //显示ImageView图片 tpczrq.setImageBitmap(decodedByte); }

2023-06-10 上传