base64转码成图片是如何处理汉字的?

11 条评论分享收藏感谢收起赞同 添加评论分享收藏感谢收起写回答14:09 提问
JAVA字符串Base64编码转换
已经得到了一个二进制的 byte[] encoded
想把这个encoded转换为Base64编码求教啊 最好把代码敲出来 谢谢了!!!!
按赞数排序
BASE64Encoder base64 = new BASE64Encoder();
String encodeStr3 = base64.encode(encoded);
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
import java.nio.charset.C
import java.util.A
引用阿里巴巴fastjson中的base64工具
自己实现encode方法
@createtime
上午11:48:38
public class Base64 {
public static final char[] CA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/".toCharArray();
public static final int[]
IA = new int[256];
Arrays.fill(IA, -1);
for (int i = 0, iS = CA. i & iS; i++)
IA[CA[i]] =
IA['='] = 0;
Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as
fast as {@link #decode(char[])}. The preconditions are:
+ The array must have a line length of 76 chars OR no line separators at all (one line).
+ Line separator must be "\r\n", as specified in RFC 2045 + The array must not contain illegal characters within
the encoded string
+ The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.
@param chars The source array. Length 0 will return an empty array. null will throw an exception.
@return The decoded array of bytes. May be of length 0.
public final static byte[] decodeFast(char[] chars, int offset, int charsLen) {
// Check special case
if (charsLen == 0) {
return new byte[0];
int sIx = offset, eIx = offset + charsLen - 1; // Start and end index after trimming.
// Trim illegal chars from start
while (sIx & eIx && IA[chars[sIx]] & 0)
// Trim illegal chars from end
while (eIx & 0 && IA[chars[eIx]] & 0)
// get the padding count (=) (0, 1 or 2)
int pad = chars[eIx] == '=' ? (chars[eIx - 1] == '=' ? 2 : 1) : 0; // Count '=' at end.
int cCnt = eIx - sIx + 1; // Content count including possible separators
int sepCnt = charsLen & 76 ? (chars[76] == '\r' ? cCnt / 78 : 0) && 1 : 0;
int len = ((cCnt - sepCnt) * 6 && 3) - // The number of decoded bytes
byte[] bytes = new byte[len]; // Preallocate byte[] of exact length
// Decode all but the last 0 - 2 bytes.
int d = 0;
for (int cc = 0, eLen = (len / 3) * 3; d & eL) {
// Assemble three bytes into an int from four "valid" characters.
int i = IA[chars[sIx++]] && 18 | IA[chars[sIx++]] && 12 | IA[chars[sIx++]] && 6 | IA[chars[sIx++]];
// Add the bytes
bytes[d++] = (byte) (i && 16);
bytes[d++] = (byte) (i && 8);
bytes[d++] = (byte)
// If line separator, jump over it.
if (sepCnt & 0 && ++cc == 19) {
if (d & len) {
// Decode last 1-3 bytes (incl '=') into 1-3 bytes
int i = 0;
for (int j = 0; sIx &= eIx - j++)
i |= IA[chars[sIx++]] && (18 - j * 6);
for (int r = 16; d & r -= 8)
bytes[d++] = (byte) (i && r);
public final static byte[] decodeFast(String chars, int offset, int charsLen) {
// Check special case
if (charsLen == 0) {
return new byte[0];
int sIx = offset, eIx = offset + charsLen - 1; // Start and end index after trimming.
// Trim illegal chars from start
while (sIx & eIx && IA[chars.charAt(sIx)] & 0)
// Trim illegal chars from end
while (eIx & 0 && IA[chars.charAt(eIx)] & 0)
// get the padding count (=) (0, 1 or 2)
int pad = chars.charAt(eIx) == '=' ? (chars.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count '=' at end.
int cCnt = eIx - sIx + 1; // Content count including possible separators
int sepCnt = charsLen & 76 ? (chars.charAt(76) == '\r' ? cCnt / 78 : 0) && 1 : 0;
int len = ((cCnt - sepCnt) * 6 && 3) - // The number of decoded bytes
byte[] bytes = new byte[len]; // Preallocate byte[] of exact length
// Decode all but the last 0 - 2 bytes.
int d = 0;
for (int cc = 0, eLen = (len / 3) * 3; d & eL) {
// Assemble three bytes into an int from four "valid" characters.
int i = IA[chars.charAt(sIx++)] && 18 | IA[chars.charAt(sIx++)] && 12 | IA[chars.charAt(sIx++)] && 6 | IA[chars.charAt(sIx++)];
// Add the bytes
bytes[d++] = (byte) (i && 16);
bytes[d++] = (byte) (i && 8);
bytes[d++] = (byte)
// If line separator, jump over it.
if (sepCnt & 0 && ++cc == 19) {
if (d & len) {
// Decode last 1-3 bytes (incl '=') into 1-3 bytes
int i = 0;
for (int j = 0; sIx &= eIx - j++)
i |= IA[chars.charAt(sIx++)] && (18 - j * 6);
for (int r = 16; d & r -= 8)
bytes[d++] = (byte) (i && r);
Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as fast
as {@link #decode(String)}. The preconditions are:
+ The array must have a line length of 76 chars OR no line separators at all (one line).
+ Line separator must be "\r\n", as specified in RFC 2045 + The array must not contain illegal characters within
the encoded string
+ The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.
@param s The source string. Length 0 will return an empty array. null will throw an exception.
@return The decoded array of bytes. May be of length 0.
public final static byte[] decodeFast(String s) {
// Check special case
int sLen = s.length();
if (sLen == 0) {
return new byte[0];
int sIx = 0, eIx = sLen - 1; // Start and end index after trimming.
// Trim illegal chars from start
while (sIx & eIx && IA[s.charAt(sIx) & 0xff] & 0)
// Trim illegal chars from end
while (eIx & 0 && IA[s.charAt(eIx) & 0xff] & 0)
// get the padding count (=) (0, 1 or 2)
int pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count '=' at end.
int cCnt = eIx - sIx + 1; // Content count including possible separators
int sepCnt = sLen & 76 ? (s.charAt(76) == '\r' ? cCnt / 78 : 0) && 1 : 0;
int len = ((cCnt - sepCnt) * 6 && 3) - // The number of decoded bytes
byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
// Decode all but the last 0 - 2 bytes.
int d = 0;
for (int cc = 0, eLen = (len / 3) * 3; d & eL) {
// Assemble three bytes into an int from four "valid" characters.
int i = IA[s.charAt(sIx++)] && 18 | IA[s.charAt(sIx++)] && 12 | IA[s.charAt(sIx++)] && 6
| IA[s.charAt(sIx++)];
// Add the bytes
dArr[d++] = (byte) (i && 16);
dArr[d++] = (byte) (i && 8);
dArr[d++] = (byte)
// If line separator, jump over it.
if (sepCnt & 0 && ++cc == 19) {
if (d & len) {
// Decode last 1-3 bytes (incl '=') into 1-3 bytes
int i = 0;
for (int j = 0; sIx &= eIx - j++)
i |= IA[s.charAt(sIx++)] && (18 - j * 6);
for (int r = 16; d & r -= 8)
dArr[d++] = (byte) (i && r);
############################# 以下不属于fast json base64 内容
##########################
public static String decode(String s){
return new String(decodeFast(s), UTF8);
} catch (Exception e) {
public static String decodeGbk(String s){
return new String(decodeFast(s), GBK);
} catch (Exception e) {
/** 编码方式 /
public static final Charset UTF8 = Charset.forName("UTF-8");
public static final Charset GBK = Charset.forName("GBK");
按照utf-8编码字符
-- 待编码字符
public static String encode(String s){
return encode(s.getBytes(UTF8));
}catch(Exception e){
e.printStackTrace();
按照gbk解码字符
public static String encodeGbk(String s){
return encode(s.getBytes(GBK));
}catch(Exception e){
e.printStackTrace();
@param target
public static String encode(byte[] target){
if(target==null||target.length==0)
int length = target.
/* 判断最后补位数 /
int replenish = length%3;
/* 判断target长度是否为总循环次数 /
int loop = length/3 + (replenish==0?0:1);
byte[] ret = new byte[4 * loop];
/* 下标 */
int index = 0;
int retIndex = 0;
int one,two,
while((--loop)&0){
one = target[index++] & 0
two = target[index++] & 0
three = target[index++] & 0
ret[retIndex++] = (byte)CA[one&&&2&0x3f];
ret[retIndex++] = (byte)CA[(one&&&4)&0x3f];
ret[retIndex++] = (byte)CA[(two&&&6)&0x3f];
ret[retIndex++] = (byte)CA[three&0x3f];
//判断最后是否还有剩余,有补等号的情况出现
switch(replenish){
one = target[index++] & 0
two = target[index++] & 0
three = target[index++] & 0
ret[retIndex++] = (byte)CA[one&&&2&0x3f];
ret[retIndex++] = (byte)CA[(one&&&4)&0x3f];
ret[retIndex++] = (byte)CA[(two&&&6)&0x3f];
ret[retIndex++] = (byte)CA[three&0x3f];
case 1://补两个=
one = target[length-1] & 0
ret[retIndex++] = (byte)CA[one&&&2&0x3f];
ret[retIndex++] = (byte)CA[one&&&2&0x3f];
ret[retIndex++] = (byte)CA[(one&&&4)&0x3f];
ret[retIndex++] = (byte)CA[two&&2 & 0x3f];
ret[retIndex++] = (byte) '=';
return new String(ret);
我上传了一个资源,编解码base64的,现在还没出地址,到时候出地址了
再给你贴上了,或者你复制我的代码进类也可以。
如果有帮助,希望结帖
我把那个类写成博客了,你可以看看
如果有帮助,希望结帖
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐输入关键字或相关内容进行搜索
前言\n最近有几个朋友一直在问语音文件怎么转base64字符串进行发送上传,base64字符串又如何转成文件,论坛中已经有多篇问题的帖子有介绍,这里只是稍微整理,方便大家可以更加方便的使用,首先看效果:
录音文件转成base64字符串\nhello mui 演示app中im-chat.html有演示案例,通过hold和release控制录音的长度,即长按按钮开始录音,释放就停止录音,上拉取消发送录音。html部分:&button id=&recorder& type=&button& class=&mui-btn mui-btn-blue mui-btn-block&&录制语音文件转base64字符串&/button&
\njs部分:mui.init中首先需要配置:mui.init({
gestureConfig: {
tap: true, //默认为true
doubletap: true, //默认为false
longtap: true, //默认为false
swipe: true, //默认为true
drag: true, //默认为true
hold: true, //默认为false,不监听
release: true //默认为false,不监听
\n录音逻辑控制,按住按钮弹出录音提示框,并且对录音时长进行控制,录音时间太短取消操作,手指上划,取消发送。var MIN_SOUND_TIME = 800;
var recorder =
var startTimestamp =
var stopTimestamp =
var stopTimer =
var recordCancel =
var soundAlert = document.getElementById(&sound-alert&);
var audioTips = document.getElementById(&audio-tips&);
// 控制录音弹出框是否播放
var setSoundAlertVisable=function(show){
soundAlert.style.display = 'block';
soundAlert.style.opacity = 1;
soundAlert.style.opacity = 0;
完成再真正隐藏
setTimeout(function(){
soundAlert.style.display = 'none';
mui.plusReady(function () {
* 录制语音文件转base64字符串
// 按住录音(长按开始录音)
document.querySelector('#recorder').addEventListener('hold',function () {
recordCancel =
if(stopTimer)clearTimeout(stopTimer);
audioTips.innerHTML = &手指上划,取消发送&;
soundAlert.classList.remove('rprogress-sigh');
setSoundAlertVisable(true);
// 获取当前设备的录音对象
recorder = plus.audio.getRecorder();
startTimestamp = (new Date()).getTime();
recorder.record({
filename:&_doc/audio/&,
format:&amr& //iOS平台支持&wav&、&aac&、&amr&格式,默认为&wav&
}, function (path) {
if (recordCancel)
console.log(&path:&+path);
Audio2dataURL(path);
}, function ( e ) {
mui.toast(&录音出现异常: & + e.message );
// 释放保存(松手保存)
document.querySelector('#recorder').addEventListener('release',function () {
if (audioTips.classList.contains(&cancel&)) {
audioTips.classList.remove(&cancel&);
audioTips.innerHTML = &手指上划,取消发送&;
// 判断录音时间
stopTimestamp = (new Date()).getTime();
if (stopTimestamp - startTimestamp & 800) {
audioTips.innerHTML = &录音时间太短&;
soundAlert.classList.add('rprogress-sigh');
recordCancel =
stopTimer=setTimeout(function(){
setSoundAlertVisable(false);
setSoundAlertVisable(false);
recorder.stop();
// 拖动屏幕(手指上划,取消发送)
document.body.addEventListener('drag', function(event) {
if (Math.abs(event.detail.deltaY) & 50) {
if (!recordCancel) {
recordCancel =
if (!audioTips.classList.contains(&cancel&)) {
audioTips.classList.add(&cancel&);
audioTips.innerHTML = &松开手指,取消发送&;
if (recordCancel) {
recordCancel =
if (audioTips.classList.contains(&cancel&)) {
audioTips.classList.remove(&cancel&);
audioTips.innerHTML = &手指上划,取消发送&;
}, false);
\n当录音成功后,我们可以将录音文件转成base64字符串,用于网络传输。/**
* 录音语音文件转base64字符串
* @param {Object} path
function Audio2dataURL (path) {
plus.io.resolveLocalFileSystemURL(path, function(entry){
entry.file(function(file){
var reader = new plus.io.FileReader();
reader.onloadend = function (e) {
console.log(e.target.result);
reader.readAsDataURL(file);
},function(e){
mui.toast(&读写出现异常: & + e.message );
\n至此我们完成了录音语音文件转base64字符串,反过来我们需要将base64字符串转成语音文件。base64字符串转成语音文件\n我们可以封装如下方法:/**
* base64字符串转成语音文件(参考http://ask.dcloud.net.cn/question/16935)
* @param {Object} base64Str
* @param {Object} callback
function dataURL2Audio (base64Str, callback) {
var base64Str = base64Str.replace('data:audio/base64,','');
var audioName = (new Date()).valueOf() + '.amr';
plus.io.requestFileSystem(plus.io.PRIVATE_DOC,function(fs){
fs.root.getFile(audioName,{create:true},function(entry){
// 获得平台绝对路径
var fullPath = entry.fullP
if(mui.os.android){
// 读取音频
var Base64 = plus.android.importClass(&android.util.Base64&);
var FileOutputStream = plus.android.importClass(&java.io.FileOutputStream&);
var out = new FileOutputStream(fullPath);
var bytes = Base64.decode(base64Str, Base64.DEFAULT);
out.write(bytes);
out.close();
callback && callback(entry);
}catch(e){
console.log(e.message);
}else if(mui.os.ios){
var NSData = plus.ios.importClass('NSData');
var nsData = new NSData();
nsData = nsData.initWithBase64EncodedStringoptions(base64Str,0);
if (nsData) {
nsData.plusCallMethod({writeToFile: fullPath,atomically:true});
plus.ios.deleteObject(nsData);
callback && callback(entry);
\n调用方法如下:html部分:&button id=&player& type=&button& class=&mui-btn mui-btn-blue mui-btn-block&&base64字符串转成语音文件播放&/button&
\njs部分:/**
* base64字符串转成语音文件播放
document.querySelector('#player').addEventListener('tap',function () {
// 语音文件Base64编码(由于编码过长影响阅读体验,请查看工程验证)
var base64Str = ' '
// 转成.amr文件播放
dataURL2Audio(base64Str, function(entry){
var toURL = entry.toURL();
// 播放音频
playAudio(toURL);
* 播放音频
* @param {Object} path
function playAudio (path) {
var player = plus.audio.createPlayer(path);
player.play(function(){
mui.toast(&播放成功&);
}, function(e) {
mui.toast(&播放失败&);
\n写在后面\n本文以语音文件为例说明5+中语音文件与Base64编码的相互转换,对于图片与Base64编码的转换方法请参考,可以通过loadBase64Data方法加载Base64编码格式图片到Bitmap对象,通过toBase64Data方法获取图片的Base64编码数据。对于一般性文件,建议使用h5 File API,详细可以参考我这篇文章:
本文详细代码请查看附件工程。
大神,请问一下,这个问题是否解决,方便 说一下嘛?
mark以下,备用
你们安卓都从base64转.amr都成功了?????为什么我不成功,要是换成固定的base64编码就能成功,要是获取的base64串就不能成功,为什么????
弱弱问一句,.project文件用什么打开啊,大神求带啊,谢谢啦!!!
在录音r.record({filename:'_doc/audio/',format:&amr&} 这个时候存储文件最后没有.amr
差不多播放了2秒就停了,还显示‘播放失败’~~~
var NSData = plus.ios.importClass('NSData');
var nsData = new NSData();
nsData = nsData.initWithBase64EncodedStringoptions(base64Str,0);
这个NSData是这么用的吗?怎么我的会报错TypeError: nsdata.initWithBase64EncodedStringoptions is not a function。。。
把你的QQ号留一下 我给你发我写的js 代码
需要转成语音文件播放。
我把语音转换成base64之后保存到input[hidden] 里面 单击播放时候 获取input值 播放了 可没有成功 求助 楼主 谢谢
这个函数是将语音base64编码转文件的,图片自然不行。
dataURL2Audio 方法在安卓真机上出错,e.message 的值为undefined,iOS 模拟器上没问题!我只是拿一个小图片(base64)试了下,没有用音频~
你ios播放成功了?
demo中ios机(6s) 生成文件 的大小为0。播放失败。
函数我在放在一个监听器里,一监听就使用输入编码来输出文件目录,我发现会存在一定几率是函数失效,因为监听器我放着一个控制台输出有没有执行到那里。
第一个问题,base64转文件的函数你是怎么使用的呢?应该不会存在失效的问题吧,另外转换的效率没有经过测试,可能会存在同时转换多个base64编码为文件失效的问题。
对于这个案例,首先感谢小青年的用心。
使用这个这个案例,在ios和安卓播放是没有问题,前提是自己录取声音的base64编码是amr格式的。
而我遇到的问题有两个,其一,我引用了base64转文件的函数,是会不定期失效的,需要重新刷新一遍才会起作用,至今未解是何原因;其二,当连续地用base64编码输入该函数来输出文件的时候,存在一定延迟,并不能都能转换成文件出来,比如连续的10个base64编码输入进去,转换出来只有九个。
这些问题,至今不知何故!
加了format还是播不了
PS:模拟器下正常, 真机调试下报错
DEMO更改后出现新的问题,{&message&:&文件不存在,http://ask.dcloud.net.cn/article/282&,&code&:-4}
感谢反馈,上述代码之前没有设置format: (String 类型 )录音文件的格式,iOS - 4.5+ (支持): iOS平台支持&wav&、&aac&、&amr&格式,默认为&wav&。我这个例子是&amr&格式的文件与BASE64编码互相转换。
录音文件为 wav,BASE64转文件 播放提示”找不到文件“。arm文件IOS直接不知道 play方法未任何响应,大神有没有什么方法能解决啊~
感谢分享,先马克
要回复文章请先或
专注前端,乐于分享!工作中出现了这种情况,因为要将手绘的图片上传到网络,所以用Base64将其转码成字符串,与其他数据一起上传;但当我将这个字符串重新解码成Bitmap的时候发现图片的背景变成了一片黑色。
一开始我怀疑是手绘位图的时候出了问题,但在网上找不到类似的信息,忽然想到,也许问题出在了Bitmap与字符串的转换之间。
于是搜索到了一篇文章:
http://www.itstrike.cn/Question/5d5b7d-800c-1cfacbe0a2e0.html
顺便吐槽一下,提问的这位一看就是外国友人,文字机翻的痕迹很严重。
题归正转,也就是说,问题出在了压缩位图时使用的格式上。
我们在画布上绘制出来的Bitmap的背景是透明的,而JPEG格式并不支持透明,所以当我们把Bitmap按照JPEG格式转码成字符串的时候,背景就变成了黑色。
而解决办法同样简单,只要在压缩位图的时候使用PNG格式就行了。
&span style="white-space:pre"& &/span&ByteArrayOutputStream out =
&span style="white-space:pre"& &/span&out = new ByteArrayOutputStream();
bitmap.compress(&span style="color:#ff0000;"&Bitmap.CompressFormat.PNG&/span&, 100, out);
out.flush();
out.close();
byte[] imgByte = out.toByteArray();
return Base64.encodeToString(imgByte, Base64.DEFAULT);
} catch (Exception e) {
// TODO Auto-generated catch block
BASE64解码后的图片显示不完整问题
BASE64解码后的图片显示不完整从前端获取base64信息就后用以下代码进行处理,发现解析出来的图片会损坏。StringBuffer filePathStr=new StringBuffer();
canvas转base64/jpeg时,透明区域变成黑色背景的解决方案
问题:png图片转jpeg时,透明区域被填充成黑色
在用canvas将png图片转jpeg时,发现透明区域被填充成黑色。
代码如下:
p&Canvas:p&
canvas id=&canvas&...
bitmap经compress后保存jpg,原透明部分自动填充为黑色,如何让其填充为白色?
泣血以告: bitmap经compress后保存jpg,原透明部分自动填充为黑色,如何让其填充为白色?
答案如下代码:
(其中,圆角程序主要部分为百度所得,来源众多,不知出处,故在此感谢大家,如有作者...
图片上传通过Bitmap转换成Base64编码然后当做请求参数上传
public static String bitmapToBase64NONseal(Bitmap bitmap) {
String result =
安卓从相机取出图片,并截图,然后对bitmap转换成base64的处理,和对base64转为bitmap的处理
import java.io.ByteArrayOutputS
import java.io.F
import android.app.A
* 由本地路径获取图片
* 再将Bitmap转换成Base64字符串
* 由本地路径获取图片
* 再将Bitmap转换成Base64字符串
* @param ...
*bitmap转base64
public static String bitmapToBase64(Bitmap bitmap){
String result...
java将图片转化为base64和base64转化为图片编码并保存在本地;以及android转base64编码
使用方法:
下面的img是拿过来的base64编码的图片
//把这个图片存储起来
String img=request.getParameter(&img&);
System.out.print(im...
讲讲如何将图片格式转化成base64格式的
又到周五了,这几周遇到一个让我很头疼的问题,接口文档里写着:
尼玛!看着就头疼,这写的什么呀,完全看不懂呀!
于是乎,一番百度,似乎有了点头绪,下面讲讲:
我不是来讲概念的,直接切入正题...
没有更多推荐了,扫一扫体验手机阅读
[C语言]Base64编码解码
<span type="1" blog_id="1869825" userid='
40篇文章,2W+人气,0粉丝
运维开发全攻略
¥51.0033人订阅
大数据时代的微服务之路
¥51.00514人订阅}

我要回帖

更多关于 oraclebase64转码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信