Android/ c# Socket -解码/ encode String64错误后1帧
本文关键字:String64 错误 1帧 encode 解码 Socket Android | 更新日期: 2023-09-27 18:03:05
我创建了一个c#服务器,它通过套接字向android客户端发送位图。这个位图是不断更新的,因为它是一个视频馈送。
服务器c#private void send_data() {
ImageConverter converter = new ImageConverter();
byte[] sendBytes = (byte[]) converter.ConvertTo(master.picturebox_master.Image, typeof(byte[]));
string_master_frame = System.Text.Encoding.UTF8.GetString(sendBytes);
string_master_frame = Convert.ToBase64String(sendBytes);
data = string_master_frame + "'n";
tcpServer1.Send(data);
}
客户端安卓
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
while (true) {
valores[26] = r.nextLine();
publishProgress(valores[26]);
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
byte[] decodedString = Base64.decode(values[26], Base64.NO_WRAP);
Bitmap master_bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
master_frame.setImageBitmap(master_bitmap);
}
发送第一帧并且Android客户端正确显示它。但是当下一帧到来时,Android客户端崩溃了。
错误:进程:com.example.tiago.java_android, PID: 826java.lang.IllegalArgumentException: base-64错误android.util.Base64.decode (Base64.java: 161)android.util.Base64.decode (Base64.java: 136)android.util.Base64.decode (Base64.java: 118)com.example.tiago.java_android.Cliente.onProgressUpdate (Cliente.java: 228)在com.example.tiago.java_android.Cliente.onProgressUpdate (Cliente.java: 28)android.os.AsyncTask InternalHandler.handleMessage美元(AsyncTask.java: 656)android.os.Handler.dispatchMessage (Handler.java: 102)android.os.Looper.loop (Looper.java: 135)android.app.ActivityThread.main (ActivityThread.java: 5431)在java.lang.reflect.Method。调用(本地方法)java.lang.reflect.Method.invoke (Method.java: 372)com.android.internal.os.ZygoteInit MethodAndArgsCaller.run美元(ZygoteInit.java: 914)com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 707)
我以为valores[26]数据被损坏了,但事实并非如此。我得到了正确的数据。我使用http://codebeautify.org/base64-to-image-converter来检查我是否得到了正确的数据。
任何想法?
PS:我的账户丢了,所以我不得不做这个。
位图master_bitmap;
byte[] decodedString = Base64.decode(values[26],Base64.NO_WRAP);
master_bitmap = BitmapFactory.decodeByteArray(decodedString,0,decodedString.length);
if(master_bitmap != null)
{
try {
master_frame.setImageBitmap(master_bitmap);
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
}
master_bitmap.recycle();
}
没有工作。错误:
. lang。RuntimeException: Canvas:尝试使用回收位图
您尝试了我之前解释的try/catch块吗?
回忆:
我有同样的问题,我几乎可以肯定这将解决你的问题:
String[] safe = values[26].split("=");
byte[] decodedString = Base64.decode(safe[0],Base64.NO_WRAP);
Bitmap master_bitmap = BitmapFactory.decodeByteArray(decodedString,0,decodedString.length);
master_frame.setImageBitmap(master_bitmap);
master_bitmap.recycle(); //THIS LINE WAS ENOUGH TO FIX MY CODE
同样,不要忘记有效地使用try/catch块。
try{//code here}catch(IllegalArgumentException e){//这里的代码如果你想}(必要时添加更多catch语句)
进一步帮助的完整代码:
byte[] bytearray = Base64.decode(dataIn);
Bitmap myBitmap = BitmapFactory.decodeByteArray(bytearray, 0,bytearray.length);
if (myBitmap!=null) {
//some irrelevant code here to turn bitmap to a PImage (a Processing image class)
}
myBitmap.recycle();
这对我来说非常有效。
试试这个:
try {
Bitmap master_bitmap;
master_bitmap=BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
if (master_bitmap != null) { //might be an unnecessary if condidition
try {
if (((BitmapDrawable)master_frame.getDrawable()).getBitmap()!=null) {
((BitmapDrawable)master_frame.getDrawable()).getBitmap().recycle();
}
master_frame.setImageBitmap(master_bitmap);
//maybe try here: master_bitmap.recycle();
}
catch(RuntimeException e) {
e.printStackTrace();
}
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}