decode base 64 [DART]

1,727

Solution 1

Your bytes do not represent a valid UTF-8 string. It appears that they are, instead, encoded in ISO-8891-1 ("Latin-1").

Use this instead:

import 'dart:convert';

void main() {
  var x = 'PCFET0NUW~~~~~~C9odG1sPg0K';

  var decoded = latin1.decode(base64.decode(x));
  print(decoded);
}

Solution 2

Assuming your string is from a jpg file. You can decode base64 string like this:

import 'dart:io';
import 'dart:convert';
import 'dart:typed_data';

massage = 'PCFET0NUWVBFIEhUTUw+DQoNCiANCiA8IS0tICoqKioqK...';
try{
      decodedBytes = base64Decode(message);
    } on FormatException catch (e) {
        print("FormatException: ${e.message}");
        return;
    }
final fileImg = File('testImage.jpg');
fileImg.writeAsBytesSync(decodedBytes, mode: FileMode.write);

Solution 3

to decode a base64 you first need to have the following import

import 'dart:convert';

and then you can decode the the base64 with the following

String decoded = utf8.decode(base64.decode(MyString)); 
Share:
1,727
Guilherme Machado
Author by

Guilherme Machado

Updated on December 22, 2022

Comments

  • Guilherme Machado
    Guilherme Machado over 1 year

    I'm new here. I have a problem decoding my string in base64.

    when I use https://www.base64decode.org/

    It works perfectly, so I believe the problem is not my String but whenever I try to dart it doesn't work

    I try to decode like this:

    HtmlSac = utf8.decode (base64Url.decode (MyString))
    

    He returns

    FormatException: Missing extension byte (at offset 2451)
    

    my String:

    PCFET0NUWVBFIEhUTUw+DQoNCiANCiA8IS0tICoqKioqKioqIENSSUEgRlVOQ0FPICJOYUxpc3RhTmVncmEiIFFVRSBWRVJJRklDQSBTRSBPIENQRi9DTlBKIEVTVEEgTkEgTElTVEEgTkVHUkEgREEgUkVDRUlUQSAqKioqKioqKioqIC0tPg0KDQoNCjxodG1sPg0KCQ0KCTxoZWFkPg0KCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCgkJPHRpdGxlPlJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWw8L3RpdGxlPg0KICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii8vd3d3LnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvdGVtYS9jc3MvcmZiLmNzcyIvPg0KICAgICAgICA8c2NyaXB0IGRhdGEtbWFpbj0iLy93d3cucmVjZWl0YS5mYXplbmRhLmdvdi5ici90ZW1hL21haW4tYnVpbHQuanMiIHNyYz0iLy93d3cucmVjZWl0YS5mYXplbmRhLmdvdi5ici90ZW1hL3JlcXVpcmUuanMiPjwvc2NyaXB0Pg0KICAgICAgICA8c2NyaXB0IHNyYz0iLy93d3cucmVjZWl0YS5mYXplbmRhLmdvdi5ici9lc3RhdGlzdGljYS9lc3RhdGlzdGljYS5qcyI+PC9zY3JpcHQ+DQoJCQ0KCQ0KCQkNCgkJDQoJCTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiID4NCgkJCWZ1bmN0aW9uIGFvU2FpcihldmVudG8pIHsNCgkJCQkvL2lmICh3aW5kb3cuRXZlbnQpIHsNCgkJCQkvLwlkb2N1bWVudC5jYXB0dXJlRXZlbnRzKEV2ZW50Lk1PVVNFVVApOw0KCQkJCS8vfQ0KCQkJCS8vYWxlcnQoZXZlbnRvKTsNCgkJCX0NCgkJCS8vYWxlcnQoY2FwdHVyZUV2ZW50cyhFdmVudCkpOw0KCQk8L3NjcmlwdD4NCgk8L2hlYWQ+DQoJDQoJPGJvZHkgdG9wbWFyZ2luPSIwIiBtYXJnaW53aWR0aD0iMCIgbGVmdG1hcmdpbj0iMCIgcmlnaHRtYXJnaW49IjAiIGJvdHRvbW1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiAgb25VbmxvYWQ9ImFvU2Fpcihkb2N1bWVudC5jYXB0dXJlRXZlbnRzKHdpbmRvdy5FdmVudCkpIj4gIA0KICAgIDxkaXYgaWQ9InJmYi1tYWluLWNvbnRhaW5lciI+DQoJPGgxPlNpdHVhJmNjZWRpbDsmYXRpbGRlO28gZGFzIERlY2xhcmEmY2NlZGlsOyZvdGlsZGU7ZXMgSVJQRiAyMDE5PC9oMT4NCgkJCTxibG9ja3F1b3RlPiANCgkJCQk8bGFiZWw+DQoJCQkJCTxiPlByZXphZG8gQ29udHJpYnVpbnRlIChDUEYgMDExLjU0Ny42MzItNjkpLDwvYj4NCgkJCQk8L2xhYmVsPiANCgkJCQk8YnI+DQoJCQkJDQoJCQkJCTxicj4NCgkJCQkJSEVSTE9OIERFIEFUQUlERSBDQU1QT1MNCgkJCTwvYmxvY2txdW90ZT4NCgkJCQ0KCQkJCTx0YWJsZSB3aWR0aD0iOTAlIiBjZWxsU3BhY2luZz0iMSIgYm9yZGVyPSIwIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQwcHg7Ij4NCgkJCQkJPHRyPg0KCQkJCQkJPHRkPg0KCQkJCQkJDQoJCQkJCQkJU3VhIGRlY2xhcmEmY2NlZGlsOyZhdGlsZGU7byBuJmF0aWxkZTtvIGNvbnN0YSBuYSBiYXNlIGRlIGRhZG9zIGRhIFJlY2VpdGEgRmVkZXJhbC48YnI+PGJyPjxicj48YnI+DQoJCQkJCQkJDQoJCQkJCQk8L3RkPg0KCQkJCQk8L3RyPg0KCQkJCTwvdGFibGU+DQoJCQkJCQkJDQoJCQk8dGFibGUgd2lkdGg9IjkwJSIgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIj4NCgkJCQk8dHI+DQoJCQkJCTx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMzMlIj4NCgkJCQkJCTwhLS08Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj4tLT4NCgkJCQkJCTxmb250IGNsYXNzPSJ0eHREYWRvc0NvbnRyaWJ1aW50ZSI+IA0KCQkJCQkJCUVtIEJyYXMmaWFjdXRlO2xpYSAtIERGDQoJCQkJCQk8L2ZvbnQ+DQoJCQkJCTwvdGQ+DQoJCQkJCTx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMzMlIj4NCgkJCQkJCTwhLS08Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj4tLT4NCgkJCQkJCTxmb250IGNsYXNzPSJ0eHREYWRvc0NvbnRyaWJ1aW50ZSI+IA0KCQkJCQkJCTIyLzA2LzIwMjANCgkJCQkJCTwvZm9udD4NCgkJCQkJPC90ZD4NCgkJCQkJPHRkIGFsaWduPSJjZW50ZXIiPg0KCQkJCQkJPCEtLTxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjIiPi0tPg0KCQkJCQkJPGZvbnQgY2xhc3M9InR4dERhZG9zQ29udHJpYnVpbnRlIj4gDQoJCQkJCQkJMTI6NDMNCgkJCQkJCTwvZm9udD4NCgkJCQkJPC90ZD4NCgkJCQk8L3RyPg0KCQkJCTx0cj4NCgkJCQkJPHRkIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPg0KCQkJCQkJPCEtLTxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjIiIGNvbG9yPSIjRkZGRkZGIj4tLT4NCgkJCQkJCTxmb250IGNsYXNzPSJ2ZXJzYW94Ij4gDQoJCQkJCQkJdmVyc+NvIDAxLjIwMTgwODE1DQoJCQkJCQk8L2ZvbnQ+DQoJCQkJCTwvdGQ+DQoJCQkJPC90cj4NCgkJCTwvdGFibGU+DQoJDQoJCQk8aHIgd2lkdGg9Ijk1JSI+DQoNCgkJCQk8dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPSIwIiBhbGlnbj0iY2VudGVyIj4NCgkJCQkJPHRyPg0KCQkJCQkJPHRkIHdpZHRoPSIzMyUiIG5vd3JhcD4mbmJzcDs8L3RkPg0KCQkJCQkJPHRkIHdpZHRoPSIzMyUiIGFsaWduPSJjZW50ZXIiPg0KCQkJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIG5hbWU9ImJ0blZvbHRhciIgdmFsdWU9IlZvbHRhciIgb25DbGljaz0ibG9jYXRpb24uaHJlZj0nLi4vaW5kZXguYXNwJyIgY2xhc3M9ImJ0biI+DQoJCQkJCQk8L3RkPg0KCQkJCQkJPHRkIHdpZHRoPSIzMyUiIGFsaWduPSJyaWdodCI+DQoJCQkJCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp3aW5kb3cucHJpbnQoKSI+PGltZyBzcmM9Imh0dHBzOi8vd3d3LnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvaW1hZ2VzL3ByaW50ZXIuZ2lmIiBib3JkZXI9IjAiIG5hbWU9ImltcHJlc3NhbyI+PC9hPg0KCQkJCQkJPC90ZD4NCgkJCQkJPC90cj4NCgkJCQk8L3RhYmxlPg0KCQ0KCQkNCgkJPHNwYW4gY2xhc3M9IlJvZGFwZSI+DQoJCTxzcGFuIGNsYXNzPSJjb3Jwb1JvZGFwZSI+QSBSZWNlaXRhIEZlZGVyYWwgYWdyYWRlY2UgYSBzdWEgdmlzaXRhLiBQYXJhIGluZm9ybWEmY2NlZGlsOyZvdGlsZGU7ZXMgc29icmUgcG9sJmlhY3V0ZTt0aWNhIGRlIHByaXZhY2lkYWRlIGUgdXNvLCA8YSBocmVmPSJodHRwOi8vaWRnLnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvc29icmUvcG9saXRpY2EtZGUtcHJpdmFjaWRhZGUiPmNsaXF1ZSBhcXVpPC9hPi4NCgkJPGJyPg0KCQk8YSBocmVmPSJodHRwOi8vaWRnLnJlY2VpdGEuZmF6ZW5kYS5nb3YuYnIvc29icmUvcG9saXRpY2EtZGUtcHJpdmFjaWRhZGUvYXZpc29zLzIwMTQvYXR1YWxpemUtc3VhLXBhZ2luYSI+QXR1YWxpemUgc3VhIHAmYWFjdXRlO2dpbmE8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmVycyZhdGlsZGU7bzogdi4wMVI8L3NwYW4+DQoJCTwvc3Bhbj4NCgkgIDwvZGl2Pg0KCSAgDQoJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+DQoJCWZ1bmN0aW9uIGphbmVsYShhYSl7DQoJCQlteXdpbmRvdyA9IHdpbmRvdy5vcGVuKGFhLCJ3bWFpbmkiLCIgc3RhdHVzPW5vLGxlZnQ9MTU1LHRvcD0zMjAsdG9vbGJhcj1ubywgbG9jYXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyxyZXNpemFibGU9bm8sbWF4aW1pemVkPTAsd2lkdGg9NjMwLGhlaWdodD0xMzAiKTsNCgkJfQ0KCQ0KCQlmdW5jdGlvbiBhYnJlQ2VudHJhbGl6YWRvKGNwZikgew0KCQkJLy9sYXJndXJhIGUgYWx0dXJhIGRlc2VqYWRvcyBkYSBqYW5lbGEgKGluZm9ybWEpDQoJCQl3aW53aWR0aCA9IDYzMDsgLy8gbGFyZ3VyYSBkYSBqYW5lbGENCgkJCXdpbmhlaWdodCA9IDEzMDsgLy8gYWx0dXJhIGRhIGphbmVsYQ0KCQkJLy9wb3Np5+NvIGRhIGphbmVsYQ0KCQkJd2lubGVmdCAgPSAyMDA7IC8vIHZhbG9yIHBhZHLjbyBjYXNvIG8gYnJvd3NlciBu428gc3Vwb3J0ZSAobmFvIGFsdGVyYXIpDQoJCQl3aW50b3AgICAgPSAyMDA7IC8vIHZhbG9yIHBhZHLjbyBjYXNvIG8gYnJvd3NlciBu428gc3Vwb3J0ZSAobmFvIGFsdGVyYXIpDQoJCQlpZiAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQpew0KCQkJCXdpbmxlZnQgPSAoc2NyZWVuLndpZHRoIC8gMikgLSAod2lud2lkdGggLyAyKTsgLy8gY2VudHJhbGl6YSBuYSBob3Jpem9udGFsDQoJCQkJd2ludG9wID0gKHNjcmVlbi5oZWlnaHQgLyAyKSAtICh3aW5oZWlnaHQgLyAyKTsgLy8gY2VudHJhbGl6YSBuYSB2ZXJpY2FsDQoJCQl9DQoJCQl3aW5kb3cub3BlbigncmVjaWJvLmFzcD9jcGY9JyArIGNwZiArICcnLCAnX2JsYW5rJywgJ3RvcD0nICsgd2ludG9wICsgJyxsZWZ0PScgKyB3aW5sZWZ0ICsgJyxoZWlnaHQ9JyArIHdpbmhlaWdodCArICcsd2lkdGg9JyArIHdpbndpZHRoKTsNCgkJfQ0KCQ0KCQlmdW5jdGlvbiBjbGljaygpew0KCQkJaWYgKGV2ZW50LmJ1dHRvbj09Mikge2FsZXJ0KCdTaXN0ZW1hIGRhIFJlY2VpdGEgRmVkZXJhbCAtIERlc2Vudm9sdmlkbyBwZWxvIFNFUlBSTycpfQ0KCQl9DQoJCWRvY3VtZW50Lm9ubW91c2Vkb3duPWNsaWNrDQoJPC9zY3JpcHQ+DQoJDQoJDQoJDQoJDQoJPC9ib2R5Pg0KPC9odG1sPg0K
    
  • Guilherme Machado
    Guilherme Machado almost 4 years
    Yes, but when a I use this way in my string doen't work. and when I decode in base64decode.org work
  • ByteMe
    ByteMe almost 4 years
    can you explain what you mean by the string doesn't work
  • ByteMe
    ByteMe almost 4 years
    It seems like the decoded string is pure html. I would suggest you ensure that the double quotes in the html are converted to single quotes before they're encoded
  • Guilherme Machado
    Guilherme Machado almost 4 years
    Yes, it's pure HTML, when I use String decoded = utf8.decode (base64.decode (MyString)) in my String I get an error Uncaught FormatException: Missing extension byte (at offset 2451)
  • Guilherme Machado
    Guilherme Machado almost 4 years
    And My backend is in Lavaral PHP, and I use base64_encode for encode
  • Guilherme Machado
    Guilherme Machado almost 4 years
    I converted everything to double quotes and the same error happens
  • Richard Heap
    Richard Heap almost 4 years
    It doesn't look like your string is actually encoded in UTF-8. (I'd guess maybe ISO-8895-1.) Using your website to utf8 you see strings like //posio da janela, but using 8895 it becomes //posição da janela, which I bet is correct. convert is correctly complaining that your bytes di not represent a valid UTF-8 string.
  • Guilherme Machado
    Guilherme Machado almost 4 years
    Thanks man, I managed to solve using your tip on my backend I used an encode in PHP utf8_encode () this way the data is encoded in utf8
  • Guilherme Machado
    Guilherme Machado almost 4 years
    Thanks man, I managed to solve using your tip on my backend I used an encode in PHP utf8_encode () this way the data is encoded in utf8