В приложении для Android, которое я создаю, я конвертирую изображение jpg в строку с помощью Base64.encodeToString() и отправляю на сервер через сокет TCP.
Проблема в том, что я пытаюсь декодировать строку обратно в изображение. Я могу распечатать полученную строку, она выглядит так в конце файла (единственная часть, которую я могу скопировать, потому что файл слишком большой, чтобы напечатать все на терминале):
....+77DgjRKHqbxBmYCDOzv9vLzFwff4N146snCWin6ZlzbN++HJOIIPodB/JTOoc1NjczeqoHwOju
iWdI6ePeSO0ADz46vh4LODnM7FCJYhbTX0TizmNatXvxSFoVzLiqfn19iYjvAPD/AQnRoUxtpJij
AAAAAElFTkSuQmCC
Но когда я снова пытаюсь декодировать и сохранять в файл jpg, я получаю следующую ошибку:
Traceback (most recent call last):
File "tcp.py", line 20, in <module>
file.write(base64.decodestring(msg))
File "/usr/lib/python2.7/base64.py", line 328, in decodestring
return binascii.a2b_base64(s)
binascii.Error: Incorrect padding
Вот фрагмент кода моего приложения для Android, который используется для кодирования и отправки сообщения:
//Function that encodes the Bitmapfile into string
public String BitMapToString(Bitmap bitmap){
ByteArrayOutputStream baos=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,100, baos);
byte [] arr=baos.toByteArray();
String result=Base64.encodeToString(arr, Base64.DEFAULT);
return result;
}
class myTask extends AsyncTask<Void,Void,Void>
{
//Faz a conexao entre aparelho e servidor
@Override
protected Void doInBackground(Void... params){
try
{
//create socket and buffer to send the string message
newSocket = new Socket(ipAdress,5000);
printWriter = new PrintWriter(newSocket.getOutputStream());
bufferedWriter = new BufferedWriter(new OutputStreamWriter(newSocket.getOutputStream()));
//Reads the internal storage image and converts into string using Base64
File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM+"/Reccoon3D/123.jpg");
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
message = BitMapToString(bitmap); //encodes the bitmap
//sends the enconded image
bufferedWriter.write(message);
bufferedWriter.flush();
bufferedWriter.close();
newSocket.close();
}catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
И вот мой код Python, который получает сообщение и пытается снова декодировать его в изображение:
import socket
import base64
host = '192.168.1.16'
port = 5000
tcp=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
orig = (host,port)
tcp.bind(orig)
tcp.listen(1)
file=open('file.png','wb')
while True:
con, client = tcp.accept()
print('Conected by', client)
while True:
msg = con.recv(1024000) #Initially 1024 but changet so the message
#would not be sliced into pieces
if not msg: break
#print(msg)
file.write(base64.decodestring(msg))
print('Finalizado com sucesso')
con.close