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:尝试使用回收位图

Android/ c# Socket -解码/ encode String64错误后1帧

您尝试了我之前解释的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.‌​leng‌​th); 
  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();
}