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
Code: Select all
wxMemoryBuffer buff = wxBase64Decode(strTest);
wxMemoryBuffer buff2;
buff2.AppendData(buff.GetData(), buff.GetDataLen());
strTest = wxString(buff2);
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);
Code: Select all
wxString strTest = "fX19XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7OiJlZ2FtaSIsXX1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjY5MDkyMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNjg0OiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiw2OiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMzM3OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNjIyNTIwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiwzODI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDU6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw5NjY5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC43ODM4MTAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDM4MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsNDoibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDUwNjkyNzc3OTAyOiJkaSJ7LH1dWzoic2RpX3RuYWlyYXYiLCIyNjI0NzU2OTQxPXY/Z25wLjQ0NTYxMDEvXHN0Y3Vkb3JwL1w1NDc5L1w0ODcxL1wxL1xzZWxpZi9ccy9cbW9jLnlmaXBvaHMubmRjL1wvXDpzcHR0aCI6ImNycyIsNzYyOiJ0aGdpZWgiLDAwNjoiaHRkaXciLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwzOiJub2l0aXNvcCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsMTQ1OTI3Nzc5MDI6ImRpInssfV1bOiJzZGlfdG5haXJhdiIsIjI2MjQ3NTY5NDE9dj9nbnAuNDYxOTAwMS9cc3RjdWRvcnAvXDU0NzkvXDQ4NzEvXDEvXHNlbGlmL1xzL1xtb2MueWZpcG9ocy5uZGMvXC9cOnNwdHRoIjoiY3JzIiw5NTI6InRoZ2llaCIsMDA2OiJodGRpdyIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLDI6Im5vaXRpc29wIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw3NzQ5Mjc3NzkwMjoiZGkieyx9XVs6InNkaV90bmFpcmF2IiwiMjYyNDc1Njk0MT12P2ducC4xNzQwMDAxL1xzdGN1ZG9ycC9cNTQ3OS9cNDg3MS9cMS9cc2VsaWYvXHMvXG1vYy55Zmlwb2hzLm5kYy9cL1w6c3B0dGgiOiJjcnMiLDQ1MjoidGhnaWVoIiwwMDY6Imh0ZGl3IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsMToibm9pdGlzb3AiLDE4MzM1NjQ3MDg6ImRpX3RjdWRvcnAiLDMxNDkyNzc3OTAyOiJkaSJ7Wzoic2VnYW1pIixdfV0ibmVlckciLCJldGloVyIsImV1bEIiLCJkZVIiLCJud29yQiJbOiJzZXVsYXYiLDE6Im5vaXRpc29wIiwicm9sb0MiOiJlbWFuIiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjE3NTc2OTc5OiJkaSJ7Wzoic25vaXRwbyIsXX1ldXJ0OiJnbmlwcGloc19zZXJpdXFlciIsMToieXRpdG5hdXFfeXJvdG5ldm5pX2RsbyIsImdrIjoidGludV90aGdpZXciLDMwLjA6InRoZ2lldyIsMToieXRpdG5hdXFfeXJvdG5ldm5pIixsbHVuOiJkaV9lZ2FtaSIsbGx1bjoiZWRvY3JhYiIsZXVydDoiZWxiYXhhdCIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZHB1IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFlcmMiLGxsdW46IjNub2l0cG8iLGxsdW46IjJub2l0cG8iLCJuZWVyRyI6IjFub2l0cG8iLGxsdW46InRuZW1lZ2FuYW1feXJvdG5ldm5pIiwibGF1bmFtIjoiZWNpdnJlc190bmVtbGxpZmx1ZiIsIjg0LjIyIjoiZWNpcnBfdGFfZXJhcG1vYyIsInluZWQiOiJ5Y2lsb3BfeXJvdG5ldm5pIiwwMzoic21hcmciLDU6Im5vaXRpc29wIiwiNS0xMzQzNzI4OTcyMyI6InVrcyIsIjc5LjAxIjoiZWNpcnAiLCJuZWVyRyI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwzNTY1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZXRpaFciOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiw0OiJub2l0aXNvcCIsIjQtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXRpaFciOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsOTg1NTE3MzY3MDM6ImRpInssfWV1cnQ6ImduaXBwaWhzX3Nlcml1cWVyIiwxOiJ5dGl0bmF1cV95cm90bmV2bmlfZGxvIiwiZ2siOiJ0aW51X3RoZ2lldyIsMzAuMDoidGhnaWV3IiwxOiJ5dGl0bmF1cV95cm90bmV2bmkiLGxsdW46ImRpX2VnYW1pIixsbHVuOiJlZG9jcmFiIixldXJ0OiJlbGJheGF0IiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWVyYyIsbGx1bjoiM25vaXRwbyIsbGx1bjoiMm5vaXRwbyIsImV1bEIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwzOiJub2l0aXNvcCIsIjMtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwiZXVsQiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiw1MjU1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwiZGVSIjoiMW5vaXRwbyIsbGx1bjoidG5lbWVnYW5hbV95cm90bmV2bmkiLCJsYXVuYW0iOiJlY2l2cmVzX3RuZW1sbGlmbHVmIiwiODQuMjIiOiJlY2lycF90YV9lcmFwbW9jIiwieW5lZCI6InljaWxvcF95cm90bmV2bmkiLDAzOiJzbWFyZyIsMjoibm9pdGlzb3AiLCIyLTEzNDM3Mjg5NzIzIjoidWtzIiwiNzkuMDEiOiJlY2lycCIsImRlUiI6ImVsdGl0IiwxODMzNTY0NzA4OiJkaV90Y3Vkb3JwIiwxNjQ1MTczNjcwMzoiZGkieyx9ZXVydDoiZ25pcHBpaHNfc2VyaXVxZXIiLDE6Inl0aXRuYXVxX3lyb3RuZXZuaV9kbG8iLCJnayI6InRpbnVfdGhnaWV3IiwzMC4wOiJ0aGdpZXciLDE6Inl0aXRuYXVxX3lyb3RuZXZuaSIsbGx1bjoiZGlfZWdhbWkiLGxsdW46ImVkb2NyYWIiLGV1cnQ6ImVsYmF4YXQiLCIwMDo0MC0yMjo0MDo3MFQ0MC02MC03MTAyIjoidGFfZGV0YWRwdSIsIjAwOjQwLTIyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIixsbHVuOiIzbm9pdHBvIixsbHVuOiIybm9pdHBvIiwibndvckIiOiIxbm9pdHBvIixsbHVuOiJ0bmVtZWdhbmFtX3lyb3RuZXZuaSIsImxhdW5hbSI6ImVjaXZyZXNfdG5lbWxsaWZsdWYiLCI4NC4yMiI6ImVjaXJwX3RhX2VyYXBtb2MiLCJ5bmVkIjoieWNpbG9wX3lyb3RuZXZuaSIsMDM6InNtYXJnIiwxOiJub2l0aXNvcCIsIjEtMTM0MzcyODk3MjMiOiJ1a3MiLCI3OS4wMSI6ImVjaXJwIiwibndvckIiOiJlbHRpdCIsMTgzMzU2NDcwODoiZGlfdGN1ZG9ycCIsNzkzNTE3MzY3MDM6ImRpIntbOiJzdG5haXJhdiIsIiI6InNnYXQiLCJsYWJvbGciOiJlcG9jc19kZWhzaWxidXAiLGxsdW46InhpZmZ1c19ldGFscG1ldCIsbGx1bjoidGFfZGVoc2lsYnVwIiwiMDA6NDAtMjI6NDA6NzBUNDAtNjAtNzEwMiI6InRhX2RldGFkcHUiLCIxMzQzNzI4OTcyMyI6ImVsZG5haCIsIjAwOjQwLTEyOjQwOjcwVDQwLTYwLTcxMDIiOiJ0YV9kZXRhZXJjIiwiIjoiZXB5dF90Y3Vkb3JwIiwidG5pb3B5dHNlVCI6InJvZG5ldiIsImUzMDB1XHAvXGMzMDB1XGUzMDB1XG5hcHMvXGMzMDB1XKB";
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;
}
So, is there something special with my Mac station or do you obtain the same result?