PDA

View Full Version : Base64 decoding problem (76 chars per line)



#Dragon
1st August 2016, 19:26
Hello, could somebody explain my why QByteArray::fromBase64() does not work if input data contains whitespaces ?

For example I've got attachment contains binary data (Jpeg image or something) and file looks that:



JMZDPEtHBFh0BplzQ+AareD3FJUm//uUZOgAArYrS5s5GmBgBUlDawZMCjyNMUzgaUE1lSa1h400
DsU0Z+hbxXKeC2sz267Ujb7bjvI9a8OrFA5vjdZTqFsTHVVp+f KfSNQclzKepQKxpEXWDg4j6urV
u/f+4duXDyoaUdJy23+uk/LuCyGWCNYkGJwbSVScdafgyX9Iz9qtWFuR7fwn1GObEh4kYUM0 jk4
..
..
..


When I try to decode it only does the first line...
How can I decode whole file ?

I tried QByteArray::fromBase64() and c++ function

(c++ function found on web)


static inline bool is_base64(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
}

static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

std::string MainWindow::base64_decode(std::string const& encoded_string)
{
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];
}

return ret;
}

I can't remove those whitespaces...

text.simplified();
text.replace("\\s", "").replace("\\n", "").replace("\\r", "").replace(" ", :);

Thank You for any help

anda_skoa
1st August 2016, 20:30
If you look at the base 64 array in that code snippet you will see that it does not contain any whitespace characters.

So the base64 decoding ends at the first one it encounters because that is when the valid input ends.

If your input is somehow split into multiple block, you'll first have to reunite these blocks into one.

Cheers,
_

#Dragon
1st August 2016, 20:39
If your input is somehow split into multiple block, you'll first have to reunite these blocks into one.

How can I do that ?

The main problem is that I can't get one block... I tried many many times and it fails

//edit



QString str, str2;
QTextStream stream(&str);
stream << ui->plainTextEdit->toPlainText();

while(!stream.atEnd()){
str2.append(stream.readLine().simplified());
}

I tried everything and cant convert it into one string

anda_skoa
1st August 2016, 22:03
Well, it depends on how the encoding program formatted the blocks, you just have to do the reverse.

- If it inserted newlines, then remove the newlines.
- If it inserted newline+carriage return, then remove both.
- If the blocks have defined length N, then take each N bytes.
- If the blocks have begin and end delimiters, take the bytes between these delimiters.

Cheers,
_

ChrisW67
1st August 2016, 22:12
QString base64String = ui->plainTextEdit->toPlainText();
base64String = base64String.replace(QRegExp("[\r\n\s]+"), "");

you might even be able to do it without the \r\n because they are considered whitespace ( i.e. Part of \s)