Hi,
The XSCryptCryptoBase64 has a bug in the base 64 encoding routine (encode).
The problem is the following type of logic:
t = ((m_inputBuffer[i++] << 4) & 0x30) | (m_inputBuffer[i] >> 4);
Normally i will only be increment after the entire expression, so it is
identical to:
t = ((m_inputBuffer[i] << 4) & 0x30) | (m_inputBuffer[i] >> 4);
i++;
However because Microsoft Visual C Compiler seems to have a problem with
overloaded [] operator, your code works as you original expected when you
compile in Debug mode. That is it will increment i just before evaluating
the r-value of the |. In Release mode however the compiler will evaluate the
expression in the correct form:
t = ((m_inputBuffer[i] << 4) & 0x30) | (m_inputBuffer[i] >> 4);
And this makes an incorrect base 64 encoding.
To solve the problem you should write the code as:
t = ((m_inputBuffer[i] << 4) & 0x30) | (m_inputBuffer[i+1] >> 4);
i++;
Best regards,
David
PS for fun, this is a piece of code demonstrating the problem in MVC (try
compile it in Release and Debug mode and see the difference in output):
class test {
int* b;
public:
test() {
b = new int[2];
b[0] = 0x0f;
b[1] = 0xf0;
}
int operator [](int i) {
return b[i];
}
};
int _tmain(int argc, _TCHAR* argv[])
{
test b;
int i=0;
//t = ((m_inputBuffer[i++] << 2) & 0x3C) | (m_inputBuffer[i] >> 6);
int k = ((b[i++]<<4) & 0xff ) | (b[i] >> 4);
printf("The correct value should be 0x0f=0x%x, i=%d\n", k, i);
return 0;
}