Hi,
I have discovered strange behavior of XSCryptCryptoBase64::encode
in VisualC++.net.
When I create xsec_1_0_0.dll in debug mode everything is ok
- encode works perfect, but when I have create release version....
something strange happend. Encode starts to create wrong output!!
I have lost, lets say, 'some time' to discover that mistakes come from
this code:
// First 6 bits;
t = (m_inputBuffer[i] >> 2);
// 2 bits from byte one and 4 from byte 2
t = ((m_inputBuffer[i++] << 4) & 0x30) |
(m_inputBuffer[i] >> 4);
m_outputBuffer[m_remainingOutput++] =
Base64LookupTable[t];
// 4 from byte 2 and 2 from byte 3
t = ((m_inputBuffer[i++] << 2) & 0x3C) |
(m_inputBuffer[i] >> 6);
m_outputBuffer[m_remainingOutput++] =
Base64LookupTable[t];
// last 6 bits from byte 3
t = m_inputBuffer[i++] & 0x3F;
m_outputBuffer[m_remainingOutput++] =
Base64LookupTable[t];
The problem is/was with '|' operator (I suppose).
So I have corrected this into something like that:
// First 6 bits;
t = (m_inputBuffer[i] >> 2);
// 2 bits from byte one and 4 from byte 2
//t = ((m_inputBuffer[i++] << 4) & 0x30) |
(m_inputBuffer[i] >> 4);
t = ((m_inputBuffer[i] << 4) & 0x30);
t |= (m_inputBuffer[i+1] >> 4);
i++;
m_outputBuffer[m_remainingOutput++] =
Base64LookupTable[t];
// 4 from byte 2 and 2 from byte 3
//t = ((m_inputBuffer[i++] << 2) & 0x3C) |
(m_inputBuffer[i] >> 6);
t = ((m_inputBuffer[i] << 2) & 0x3C);
t |= (m_inputBuffer[i+1] >> 6);
i++;
m_outputBuffer[m_remainingOutput++] =
Base64LookupTable[t];
// last 6 bits from byte 3
t = m_inputBuffer[i++] & 0x3F;
m_outputBuffer[m_remainingOutput++] =
Base64LookupTable[t];
I know, that this is not 'a beautiful' code, but it works.
And here is my question: have I something wrong (wrong opitions,
declaration, etc.)
in my release project configuration in Visual? Maybe this is relevant to
type conversions?
Best regards,
AndrzeJ