I am building a windows phone app and i added a windows phone runtime component with this function in order to decode a string which i provide. The same function seems to be working correctly in a console application if i provide an std::string and return the same type. I think my problem is that i am converting from one type to another in the wrong way, but i can't see what i am doing wrong!
String^ Base64Encoding::base64_decode(String^ someString) {
std::wstring ws1(someString->Data());
std::string encoded_string(ws1.begin(), ws1.end());
int in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;
while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[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];
}
std::wstring widestr = std::wstring(ret.begin(), ret.end());
const wchar_t* wcstring2 = widestr.c_str();
return ref new String(wcstring2);
}
So what am i doing wrong here?
Normally, the output of a Base64 decode isn't a string, it's a byte array. Base64 can encode arbitrary binary data, and depending on the string's encoding, not all byte arrays are valid strings.
To do a Base64 decode, use Convert::FromBase64String. If you want to interpret that byte array as a string, I suggest you use one of the Encoding classes, such as Encoding.Unicode, to do that conversion.