wxBase64Decode fails with a specific encoded string in OS X Topic is solved

Do you have a typical platform dependent issue you're battling with ? Ask it here. Make sure you mention your platform, compiler, and wxWidgets version.
Post Reply
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

Hello,

Not quite sure (so, here rather than wxTracker directly), but maybe an issue with wxBase64Decode on Mac (seen with OS X 10.9 Mavericks). I found a base64 encoded string (only seen with this string, it works with all others I tested) which can't be decoded in OSX, while it's well decoded in Windows.

wxBase64Decode doesn't report any failure (no invalid char reported using posErr parameter), but the resulting string is empty.

Here is the minimum test code:

Code: Select all

wxString strTest = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5lbGJhbGlhdkEgc3JvbG9DIDUgc3JvbG9DZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5nbml2aUQgcGVlRCBlbHl0U2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZ25pdGFvbEYgbm9pdGNBZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5NNCBodHBlRGUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwubW0wNyApc3BpbCBlaHQgZWR1bGNuaSB0J25vRChodGduZUxlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmc4LjcxIHRoZ2llV2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuMzBCQSByZWJtdU4gbGVkb01lMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLnJldmlSLGRub1AgcmlvdnJlc2VSLGVrYUwgbm9pdGlzb1BlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmV1bGJsbGEgZW1hTiBkbmFyQmUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZXJ1TCB5cm9nZXRhQ2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwudGlhQiBsYWljaWZpdHJBIGVweVRlMzAwdVxwYzMwMHVcblxyXGUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcbGFpY2lmaXRyYSBhY3NpIGVoY2VwIHNrb29IIHJlbndPICM2IGh0aVcgc3JlbGJib1cgZWtpbGVmaUwgbW0wNy9cZzguNzEgc2VydUwgZ25paHNpRiB0aWFia25hckMgZ25pdmlEIHBlZUQgZ25pdGFvbEYgRVVMQkxMQWUzMDB1XHBjMzAwdVwiOiJsbXRoX3lkb2IiLCJsYWljaWZpdHJhIGFjc2kgZWhjZXAgc2tvb0ggcmVud08gIzYgaHRpVyBzcmVsYmJvVyBla2lsZWZpTCBtbTA3L1xnOC43MSBzZXJ1TCBnbmloc2lGIHRpYWJrbmFyQyBnbml2aUQgcGVlRCBnbml0YW9sRiBFVUxCTExBIjoiZWx0aXQiLDE4MzM1NjQ3MDg6ImRpIns6InRjdWRvcnAiewoKM";

wxMemoryBuffer buff = wxBase64Decode(strTest);
wxString strTest = wxString(buff);
wxMessageBox(strTest);	// shows an empty string
So, I tried different ways, like:

Code: Select all

wxMemoryBuffer buff = wxBase64Decode(strTest);
wxMemoryBuffer buff2;
buff2.AppendData(buff.GetData(), buff.GetDataLen());
strTest = wxString(buff2);
or

Code: Select all

size_t nSourceLen = strTest.Len();
size_t nBuffLen = wxBase64DecodedSize(nSourceLen);
char* pBuffer = (char*) malloc(nBuffLen);
memset(pBuffer, 0, nBuffLen);
size_t nPosErr = 9999999;
wxBase64Decode(pBuffer, nBuffLen, strSource.data(), nSourceLen, wxBase64DecodeMode_Strict, &nPosErr);
wxMessageBox(wxString::Format("String length: %lu\nBuffer length: %lu\nFailed at char (9999999 means 'none'): %lu", nSourceLen, nBuffLen, nPosErr));
strTest = wxString(pBuffer);
free(pBuffer);
And all these ways fail with this base64 encoded string... Until I shortcut it to:

Code: Select all

wxString strTest = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKB";
If I add a single character to this (next char is "l"), it fails.

So, for the moment, I replaced wxBase64Decode with the implementation below, but it's far slower:

Code: Select all

// Adaptation of base64_decode() from http://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp
static const wxString base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static inline bool is_base64(unsigned char c){
    return (isalnum(c) || (c == '+') || (c == '/'));}
wxString Base64DecodeNoWX(wxString strSource)
{
    int in_len = strSource.Len();
    int i = 0;
    int j = 0;
    int in_ = 0;
    unsigned char char_array_4[4], char_array_3[3];
    wxString ret;

    while (in_len-- && ( strSource[in_] != '=') && is_base64(strSource[in_]))
    {
        char_array_4[i++] = strSource[in_];
        in_++;
        if (i ==4)
        {
            for (i = 0; i <4; i++)
                char_array_4[i] = base64_chars.find(char_array_4[i]);

            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

            for (i = 0; (i < 3); i++)
                ret += char_array_3[i];

            i = 0;
        }
    }

    if (i)
    {
        for (j = i; j <4; j++)
            char_array_4[j] = 0;

        for (j = 0; j <4; j++)
            char_array_4[j] = base64_chars.find(char_array_4[j]);

        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

        for (j = 0; (j < i - 1); j++)
            ret += char_array_3[j];
    }

    return ret;
}
I don't understand what's wrong with this specific base64 encoded string. It's a valid one since it works well under Windows and in an online decoder like this one: https://www.base64decode.org.

So, is there something special with my Mac station or do you obtain the same result?
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
PB
Part Of The Furniture
Part Of The Furniture
Posts: 4204
Joined: Sun Jan 03, 2010 5:45 pm

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by PB »

I don't use OSX so I cannot test the code, but have you tried to step into wxBase64Decode to see where and why it fails for you? E.g., placing few breakpoints in the strategic places there and running your code should be easy and quick and give you a hint...
User avatar
doublemax
Moderator
Moderator
Posts: 19160
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by doublemax »

I think the conversion fails under Windows, too. buff.GetDataLen() returns 0 when i test it. You're just getting a result because you ignore that value.

I didn't dig any deeper yet.

BTW: When i look at the decoded string, it looks like it's reversed. Is that intended?
Use the source, Luke!
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

Hi doublemax. Hmm, OK I'll check again under Windows (maybe I didn't noticed because the rest of my treatment only need some values in the resulting strings). Yes, it's a reversed JSON string, it's voluntary (a way to disable some and force failure during parsing).

Well, so, it's no due to my own context and the issue could come from buffer...
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

PB wrote:I don't use OSX so I cannot test the code, but have you tried to step into wxBase64Decode to see where and why it fails for you? E.g., placing few breakpoints in the strategic places there and running your code should be easy and quick and give you a hint...
No, didn't debugged in wxWidgets itself for the moment, PB... Just because (as usual) I was a little in urge (stack of support tickets from my customers because of this) and should first find a quick fix. And also because debugging under Mac is always a nightmare (even using a dedicated tool for this, I always found it unstable and slow; and knowing of course I don't go with XCode)...
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
PB
Part Of The Furniture
Part Of The Furniture
Posts: 4204
Joined: Sun Jan 03, 2010 5:45 pm

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by PB »

I can confirm it fails to decode on Windows too (rather recent GIT master). This code

Code: Select all

#include <wx/wx.h>
#include <wx/base64.h> 

class MyFrame : public wxFrame
{
public:
    MyFrame()
        : wxFrame(NULL, wxID_ANY, "Test")
    {
        wxLog::SetActiveTarget(new wxLogTextCtrl(new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH2)));
        wxLog::SetTimestamp("");
        
        wxString strTest = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5lbGJhbGlhdkEgc3JvbG9DIDUgc3JvbG9DZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5nbml2aUQgcGVlRCBlbHl0U2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZ25pdGFvbEYgbm9pdGNBZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5NNCBodHBlRGUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwubW0wNyApc3BpbCBlaHQgZWR1bGNuaSB0J25vRChodGduZUxlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmc4LjcxIHRoZ2llV2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuMzBCQSByZWJtdU4gbGVkb01lMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLnJldmlSLGRub1AgcmlvdnJlc2VSLGVrYUwgbm9pdGlzb1BlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmV1bGJsbGEgZW1hTiBkbmFyQmUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZXJ1TCB5cm9nZXRhQ2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwudGlhQiBsYWljaWZpdHJBIGVweVRlMzAwdVxwYzMwMHVcblxyXGUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcbGFpY2lmaXRyYSBhY3NpIGVoY2VwIHNrb29IIHJlbndPICM2IGh0aVcgc3JlbGJib1cgZWtpbGVmaUwgbW0wNy9cZzguNzEgc2VydUwgZ25paHNpRiB0aWFia25hckMgZ25pdmlEIHBlZUQgZ25pdGFvbEYgRVVMQkxMQWUzMDB1XHBjMzAwdVwiOiJsbXRoX3lkb2IiLCJsYWljaWZpdHJhIGFjc2kgZWhjZXAgc2tvb0ggcmVud08gIzYgaHRpVyBzcmVsYmJvVyBla2lsZWZpTCBtbTA3L1xnOC43MSBzZXJ1TCBnbmloc2lGIHRpYWJrbmFyQyBnbml2aUQgcGVlRCBnbml0YW9sRiBFVUxCTExBIjoiZWx0aXQiLDE4MzM1NjQ3MDg6ImRpIns6InRjdWRvcnAiewoKM";

        size_t posErr = 0;
        wxMemoryBuffer buff(wxBase64Decode(strTest, wxBase64DecodeMode_Strict, &posErr));
                        
        if ( !buff.IsEmpty() )        
            wxLogMessage("Decode OK (buff data len %zu): %s", buff.GetDataLen(), wxString(buff)); 
        else
            wxLogError("Failed to decode the string, buff size %zu, invalid character index %zu.", buff.GetBufSize(), posErr);
    }
};

class MyApp : public wxApp
{
public:
    virtual bool OnInit()
    {     
        (new MyFrame())->Show();        
        return true;
    }
}; wxIMPLEMENT_APP(MyApp);
produces
Error: Failed to decode the string, buff size 7114, invalid character index 8120.
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

OK, PB, in the meantime, I conducted my tests on my part and the result is different than yours and the doublemax one in the sense it works under Windows for me... But, but, yesterday evening I missed some chars (three) at the end of the full encoded string in my post. So, please, could you confirm (or not) with this one:

Code: Select all

wxString strTest = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5lbGJhbGlhdkEgc3JvbG9DIDUgc3JvbG9DZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5nbml2aUQgcGVlRCBlbHl0U2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZ25pdGFvbEYgbm9pdGNBZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5NNCBodHBlRGUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwubW0wNyApc3BpbCBlaHQgZWR1bGNuaSB0J25vRChodGduZUxlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmc4LjcxIHRoZ2llV2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuMzBCQSByZWJtdU4gbGVkb01lMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLnJldmlSLGRub1AgcmlvdnJlc2VSLGVrYUwgbm9pdGlzb1BlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmV1bGJsbGEgZW1hTiBkbmFyQmUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZXJ1TCB5cm9nZXRhQ2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwudGlhQiBsYWljaWZpdHJBIGVweVRlMzAwdVxwYzMwMHVcblxyXGUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcbGFpY2lmaXRyYSBhY3NpIGVoY2VwIHNrb29IIHJlbndPICM2IGh0aVcgc3JlbGJib1cgZWtpbGVmaUwgbW0wNy9cZzguNzEgc2VydUwgZ25paHNpRiB0aWFia25hckMgZ25pdmlEIHBlZUQgZ25pdGFvbEYgRVVMQkxMQWUzMDB1XHBjMzAwdVwiOiJsbXRoX3lkb2IiLCJsYWljaWZpdHJhIGFjc2kgZWhjZXAgc2tvb0ggcmVud08gIzYgaHRpVyBzcmVsYmJvVyBla2lsZWZpTCBtbTA3L1xnOC43MSBzZXJ1TCBnbmloc2lGIHRpYWJrbmFyQyBnbml2aUQgcGVlRCBnbml0YW9sRiBFVUxCTExBIjoiZWx0aXQiLDE4MzM1NjQ3MDg6ImRpIns6InRjdWRvcnAiewoKMTAy";
Well, so here are my own results using these four ways:

Code: Select all

wxString strDecoded;

// #1
strDecoded = ::Base64Decode(strTest);
wxMessageBox("#1:\n\n" + strDecoded);

// #2
strDecoded = ::Base64DecodeNoWX(strTest);
wxMessageBox("#2:\n\n" + strDecoded);

// #3
wxMemoryBuffer buff1 = wxBase64Decode(strTest);
strDecoded = wxString(buff1);
wxMessageBox("#3:\n\n" + strDecoded);

// #4
wxMemoryBuffer buff2 = wxBase64Decode(strTest);
wxMemoryBuffer buff3;
buff3.AppendData(buff2.GetData(), buff2.GetDataLen());
strDecoded = wxString(buff3);
wxMessageBox("#4:\n\n" + strDecoded);
I obtain this under Windows 7 Pro 64-bit:
Way #1 in Windows - BAD (issue extra char maybe because of unitialized buffer internally, so no null termination)
Way #1 in Windows - BAD (issue extra char maybe because of unitialized buffer internally, so no null termination)
Way #2 in Windows - GOOD!
Way #2 in Windows - GOOD!
Way #3 in Windows - GOOD!
Way #3 in Windows - GOOD!
Next screenshots in next coming post [.../...]
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

[.../...]
Way #4 in Windows - BAD (same as #1 amplified)
Way #4 in Windows - BAD (same as #1 amplified)
And under OS X 10.9 Mavericks:
Way #1 in OS X - BAD (empty string)
Way #1 in OS X - BAD (empty string)
snap_0004616.png (9.48 KiB) Viewed 3088 times
Way #2 in OS X - GOOD! (saved in file rather than messagebox because of screen overflow on height)
Way #2 in OS X - GOOD! (saved in file rather than messagebox because of screen overflow on height)
[.../...]
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

[.../...]
Way #3 in OS X - BAD (empty string)
Way #3 in OS X - BAD (empty string)
snap_0004619.png (9.48 KiB) Viewed 3087 times
Way #4 in OS X - BAD (empty string)
Way #4 in OS X - BAD (empty string)
snap_0004617.png (9.83 KiB) Viewed 3087 times
So, if we summarize:
snap_0004621.png
snap_0004621.png (1.94 KiB) Viewed 3087 times
The way #2 is the only one working both in Windows and OS X on my part.
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
User avatar
doublemax
Moderator
Moderator
Posts: 19160
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by doublemax »

And how does the code inside Base64DecodeNoWX look like?

I believe the problem has nothing to do with the base64 decoding. I tested it under Windows with the new, complete byte sequence and noticed that the resulting byte buffer can not be converted to a wxString with FromAscii() or FromUTF8(). Which means that it uses a specific, unknown local encoding. And i think that's the reason why the conversion to wxString fails. Try researching in that direction.
Use the source, Luke!
User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

doublemax wrote:And how does the code inside Base64DecodeNoWX look like?
Oh, Base64DecodeNoWX is the adapted implementation coming from http://renenyffenegger.ch/notes/develop ... 4-with-cpp I mentionned in my first post.
doublemax wrote:I believe the problem has nothing to do with the base64 decoding. I tested it under Windows with the new, complete byte sequence and noticed that the resulting byte buffer can not be converted to a wxString with FromAscii() or FromUTF8(). Which means that it uses a specific, unknown local encoding. And i think that's the reason why the conversion to wxString fails. Try researching in that direction.
On my part, I tested the PB's code and it effectivelly fails with the previous string (with last chars missing), but it well works with the right one (see screenshots below). So, I don't know what to think, I'm under Windows 7 FR, but I don't use any exotic characters encoding in the app... In the original code, I have a regular UTF-8 string stored as wxString that I encode using wxBase64Encode, then I save the encoded result in a text file through wxFileOutputStream and wxTextOutputStream. When I want to retrieve the original string, I load from this text file going through wxFileInputStream and wxTextInputStream, then I go with the base64 decoding code.

Below are my results for the PB's code under Windows 7 Pro FR 64-bit, wxWidgets 3.1.0 and TDM-GCC 4.7.1 for a 64-bit target. I just replaced %zu by %Iu because %zu is not recognised using MinGW64 (see http://trac.wxwidgets.org/ticket/17492).
BAD as you going with the first wrong (truncated) encoded string.
BAD as you going with the first wrong (truncated) encoded string.
snap_0004623.png (54.24 KiB) Viewed 3078 times
GOOD with the right (complete) encoded string.
GOOD with the right (complete) encoded string.
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
User avatar
doublemax
Moderator
Moderator
Posts: 19160
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by doublemax »

The truncated string is not a valid base64 string. That's supposed to fail.

Forget about the string conversion for now, just check how many bytes wxBase64Decode() returns.
If it says "6093 bytes decoded, errpos=-1", the base64 conversion is ok and the problem lies somewhere else (the conversion from 8bit data to a Unicode wxString).

As wxBase64Decode is platform independent, i find it hard to believe that it behaves differently under OSX. However, you are probably using a 64bit build, while i'm using a 32bit build. So that could theoretically be an issue.

This is the code i used for testing:

Code: Select all

const char base64[] = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5lbGJhbGlhdkEgc3JvbG9DIDUgc3JvbG9DZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5nbml2aUQgcGVlRCBlbHl0U2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZ25pdGFvbEYgbm9pdGNBZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5NNCBodHBlRGUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwubW0wNyApc3BpbCBlaHQgZWR1bGNuaSB0J25vRChodGduZUxlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmc4LjcxIHRoZ2llV2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuMzBCQSByZWJtdU4gbGVkb01lMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLnJldmlSLGRub1AgcmlvdnJlc2VSLGVrYUwgbm9pdGlzb1BlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmV1bGJsbGEgZW1hTiBkbmFyQmUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZXJ1TCB5cm9nZXRhQ2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwudGlhQiBsYWljaWZpdHJBIGVweVRlMzAwdVxwYzMwMHVcblxyXGUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcbGFpY2lmaXRyYSBhY3NpIGVoY2VwIHNrb29IIHJlbndPICM2IGh0aVcgc3JlbGJib1cgZWtpbGVmaUwgbW0wNy9cZzguNzEgc2VydUwgZ25paHNpRiB0aWFia25hckMgZ25pdmlEIHBlZUQgZ25pdGFvbEYgRVVMQkxMQWUzMDB1XHBjMzAwdVwiOiJsbXRoX3lkb2IiLCJsYWljaWZpdHJhIGFjc2kgZWhjZXAgc2tvb0ggcmVud08gIzYgaHRpVyBzcmVsYmJvVyBla2lsZWZpTCBtbTA3L1xnOC43MSBzZXJ1TCBnbmloc2lGIHRpYWJrbmFyQyBnbml2aUQgcGVlRCBnbml0YW9sRiBFVUxCTExBIjoiZWx0aXQiLDE4MzM1NjQ3MDg6ImRpIns6InRjdWRvcnAiewoKMTAy";

size_t errPos = -1; 
wxMemoryBuffer buff = wxBase64Decode(base64, strlen(base64), wxBase64DecodeMode_Relaxed, &errPos);
wxLogMessage("%d bytes decoded, errpos=%d", buff.GetDataLen(), errPos );
Use the source, Luke!
PB
Part Of The Furniture
Part Of The Furniture
Posts: 4204
Joined: Sun Jan 03, 2010 5:45 pm

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by PB »

I succeeded to decode the buffer and convert it to wxString (using wxString::From8bitData()). As doublemax said, wxString could not be created from UTF8 or ASCII. If you expect the string to be a valid UTF8 string or have only 7-bit characters, you need to look into character encoding of the original base64 encoded string.

Code: Select all

#include <wx/wx.h>
#include <wx/base64.h>

class MyFrame : public wxFrame
{
public:
    MyFrame() : wxFrame(NULL, wxID_ANY, "Test")
    {
        wxLog::SetActiveTarget(new wxLogTextCtrl(new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH2)));
        wxLog::SetTimestamp("");
               
        wxString strTest = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5lbGJhbGlhdkEgc3JvbG9DIDUgc3JvbG9DZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5nbml2aUQgcGVlRCBlbHl0U2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZ25pdGFvbEYgbm9pdGNBZTMwMHVccmJjMzAwdVxlMzAwdVxuYXBzL1xjMzAwdVygZTMwMHVcbmFwc2MzMDB1XC5NNCBodHBlRGUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwubW0wNyApc3BpbCBlaHQgZWR1bGNuaSB0J25vRChodGduZUxlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmc4LjcxIHRoZ2llV2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuMzBCQSByZWJtdU4gbGVkb01lMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLnJldmlSLGRub1AgcmlvdnJlc2VSLGVrYUwgbm9pdGlzb1BlMzAwdVxyYmMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcLmV1bGJsbGEgZW1hTiBkbmFyQmUzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwuZXJ1TCB5cm9nZXRhQ2UzMDB1XHJiYzMwMHVcZTMwMHVcbmFwcy9cYzMwMHVcoGUzMDB1XG5hcHNjMzAwdVwudGlhQiBsYWljaWZpdHJBIGVweVRlMzAwdVxwYzMwMHVcblxyXGUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKBlMzAwdVxuYXBzYzMwMHVcbGFpY2lmaXRyYSBhY3NpIGVoY2VwIHNrb29IIHJlbndPICM2IGh0aVcgc3JlbGJib1cgZWtpbGVmaUwgbW0wNy9cZzguNzEgc2VydUwgZ25paHNpRiB0aWFia25hckMgZ25pdmlEIHBlZUQgZ25pdGFvbEYgRVVMQkxMQWUzMDB1XHBjMzAwdVwiOiJsbXRoX3lkb2IiLCJsYWljaWZpdHJhIGFjc2kgZWhjZXAgc2tvb0ggcmVud08gIzYgaHRpVyBzcmVsYmJvVyBla2lsZWZpTCBtbTA3L1xnOC43MSBzZXJ1TCBnbmloc2lGIHRpYWJrbmFyQyBnbml2aUQgcGVlRCBnbml0YW9sRiBFVUxCTExBIjoiZWx0aXQiLDE4MzM1NjQ3MDg6ImRpIns6InRjdWRvcnAiewoKMTAy";

        size_t posErr = 0;
        wxMemoryBuffer buff(wxBase64Decode(strTest, wxBase64DecodeMode_Strict, &posErr));
                       
        if ( !buff.IsEmpty() )       
        {            
            wxLogMessage("Decode succeeded: buff data len %lu", buff.GetDataLen());

            wxString result(wxString::From8BitData((char*)buff.GetData(), buff.GetDataLen()));
            
            if ( !result.empty() )            
                wxLogMessage("Decoded string (length %lu): %s", result.size(), result);
            else
                wxLogMessage("Could not create string from memory buffer");
        }
        else
            wxLogError("Failed to decode the string, buff size %lu, invalid character index %lu.", buff.GetBufSize(), posErr);
    }
};

class MyApp : public wxApp
{
public:
    virtual bool OnInit()
    {     
        (new MyFrame())->Show();       
        return true;
    }
}; wxIMPLEMENT_APP(MyApp);

Code: Select all

Decode succeeded: buff data len 6093
Decoded string (length 6093): }}}][:"sdi_tnairav","2624756941=v?gnp.1740001/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",452:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",1:"noitisop",1833564708:"di_tcudorp",31492777902:"di"{:"egami",]}][:"sdi_tnairav","2624756941=v?gnp.6909201/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",684:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",6:"noitisop",1833564708:"di_tcudorp",33792777902:"di"{,}][:"sdi_tnairav","2624756941=v?gnp.6225201/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",382:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",5:"noitisop",1833564708:"di_tcudorp",96692777902:"di"{,}][:"sdi_tnairav","2624756941=v?gnp.7838101/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",382:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",4:"noitisop",1833564708:"di_tcudorp",50692777902:"di"{,}][:"sdi_tnairav","2624756941=v?gnp.4456101/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",762:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",3:"noitisop",1833564708:"di_tcudorp",14592777902:"di"{,}][:"sdi_tnairav","2624756941=v?gnp.4619001/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",952:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",2:"noitisop",1833564708:"di_tcudorp",77492777902:"di"{,}][:"sdi_tnairav","2624756941=v?gnp.1740001/\stcudorp/\5479/\4871/\1/\selif/\s/\moc.yfipohs.ndc/\/\:sptth":"crs",452:"thgieh",006:"htdiw","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",1:"noitisop",1833564708:"di_tcudorp",31492777902:"di"{[:"segami",]}]"neerG","etihW","eulB","deR","nworB"[:"seulav",1:"noitisop","roloC":"eman",1833564708:"di_tcudorp",5217576979:"di"{[:"snoitpo",]}eurt:"gnippihs_seriuqer",1:"ytitnauq_yrotnevni_dlo","gk":"tinu_thgiew",30.0:"thgiew",1:"ytitnauq_yrotnevni",llun:"di_egami",llun:"edocrab",eurt:"elbaxat","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",llun:"3noitpo",llun:"2noitpo","neerG":"1noitpo",llun:"tnemeganam_yrotnevni","launam":"ecivres_tnemllifluf","84.22":"ecirp_ta_erapmoc","yned":"ycilop_yrotnevni",03:"smarg",5:"noitisop","5-13437289723":"uks","79.01":"ecirp","neerG":"eltit",1833564708:"di_tcudorp",35651736703:"di"{,}eurt:"gnippihs_seriuqer",1:"ytitnauq_yrotnevni_dlo","gk":"tinu_thgiew",30.0:"thgiew",1:"ytitnauq_yrotnevni",llun:"di_egami",llun:"edocrab",eurt:"elbaxat","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",llun:"3noitpo",llun:"2noitpo","etihW":"1noitpo",llun:"tnemeganam_yrotnevni","launam":"ecivres_tnemllifluf","84.22":"ecirp_ta_erapmoc","yned":"ycilop_yrotnevni",03:"smarg",4:"noitisop","4-13437289723":"uks","79.01":"ecirp","etihW":"eltit",1833564708:"di_tcudorp",98551736703:"di"{,}eurt:"gnippihs_seriuqer",1:"ytitnauq_yrotnevni_dlo","gk":"tinu_thgiew",30.0:"thgiew",1:"ytitnauq_yrotnevni",llun:"di_egami",llun:"edocrab",eurt:"elbaxat","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",llun:"3noitpo",llun:"2noitpo","eulB":"1noitpo",llun:"tnemeganam_yrotnevni","launam":"ecivres_tnemllifluf","84.22":"ecirp_ta_erapmoc","yned":"ycilop_yrotnevni",03:"smarg",3:"noitisop","3-13437289723":"uks","79.01":"ecirp","eulB":"eltit",1833564708:"di_tcudorp",52551736703:"di"{,}eurt:"gnippihs_seriuqer",1:"ytitnauq_yrotnevni_dlo","gk":"tinu_thgiew",30.0:"thgiew",1:"ytitnauq_yrotnevni",llun:"di_egami",llun:"edocrab",eurt:"elbaxat","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",llun:"3noitpo",llun:"2noitpo","deR":"1noitpo",llun:"tnemeganam_yrotnevni","launam":"ecivres_tnemllifluf","84.22":"ecirp_ta_erapmoc","yned":"ycilop_yrotnevni",03:"smarg",2:"noitisop","2-13437289723":"uks","79.01":"ecirp","deR":"eltit",1833564708:"di_tcudorp",16451736703:"di"{,}eurt:"gnippihs_seriuqer",1:"ytitnauq_yrotnevni_dlo","gk":"tinu_thgiew",30.0:"thgiew",1:"ytitnauq_yrotnevni",llun:"di_egami",llun:"edocrab",eurt:"elbaxat","00:40-22:40:70T40-60-7102":"ta_detadpu","00:40-22:40:70T40-60-7102":"ta_detaerc",llun:"3noitpo",llun:"2noitpo","nworB":"1noitpo",llun:"tnemeganam_yrotnevni","launam":"ecivres_tnemllifluf","84.22":"ecirp_ta_erapmoc","yned":"ycilop_yrotnevni",03:"smarg",1:"noitisop","1-13437289723":"uks","79.01":"ecirp","nworB":"eltit",1833564708:"di_tcudorp",79351736703:"di"{[:"stnairav","":"sgat","labolg":"epocs_dehsilbup",llun:"xiffus_etalpmet",llun:"ta_dehsilbup","00:40-22:40:70T40-60-7102":"ta_detadpu","13437289723":"eldnah","00:40-12:40:70T40-60-7102":"ta_detaerc","":"epyt_tcudorp","tniopytseT":"rodnev","e300u\p/\c300u\e300u\naps/\c300u\ e300u\napsc300u\e300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.elbaliavA sroloC 5 sroloCe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.gniviD peeD elytSe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.gnitaolF noitcAe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.M4 htpeDe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.mm07 )spil eht edulcni t'noD(htgneLe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.g8.71 thgieWe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.30BA rebmuN ledoMe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.reviR,dnoP riovreseR,ekaL noitisoPe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.eulblla emaN dnarBe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.eruL yrogetaCe300u\rbc300u\e300u\naps/\c300u\ e300u\napsc300u\.tiaB laicifitrA epyTe300u\pc300u\n\r\e300u\p/\c300u\e300u\naps/\c300u\ e300u\napsc300u\laicifitra acsi ehcep skooH renwO #6 htiW srelbboW ekilefiL mm07/\g8.71 seruL gnihsiF tiabknarC gniviD peeD gnitaolF EULBLLAe300u\pc300u\":"lmth_ydob","laicifitra acsi ehcep skooH renwO #6 htiW srelbboW ekilefiL mm07/\g8.71 seruL gnihsiF tiabknarC gniviD peeD gnitaolF EULBLLA":"eltit",1833564708:"di"{:"tcudorp"{

102

User avatar
eranon
Can't get richer than this
Can't get richer than this
Posts: 867
Joined: Sun May 13, 2012 11:42 pm
Location: France
Contact:

Re: wxBase64Decode fails with a specific encoded string in OS X

Post by eranon »

I agree, we forget the truncated string ;)

And for the right one, here are the results on my part:

Under Windows 7 64-bit (MinGW-64), here it succeeds both with 32 & 64-bit targets with both the previous PB's code and yours + conversion from 8-bit data to get final wxString (see below; got "6093 bytes decoded, errpos=-1" and right decoded string).

Under OS X 10.9 Mavericks (LLVM Clang), it succeeds both with 32 & 64-bit targets with your code, doublemax, but with the previous PB's one, it succeeds only at buffer level then fails at wxString conversion one (empty resulting string).

So, the key point is:

Code: Select all

wxString strDecoded = wxString::From8BitData(static_cast<const char*>(buff.GetData()), buff.GetDataLen());
Bravo doublemax! And thanks to both of you, doublemax and PB >^o^<
[Ind. dev. - wxWidgets 3.0/3.1 under "Win 7 64-bit, TDM64-GCC" + "OS X 10.9, LLVM Clang"]
Post Reply