Я пытаюсь base64 кодировать строку в Юникоде. Я столкнулся с проблемами, после кодирования вывод - это моя строка base64'ed, однако в каждом коде есть нулевые байты в случайных местах, я не знаю, почему, или как их получить.C++ Base64 Unicode - null bytes
Вот моя Base64Encode функция:
static char Base64Digits[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/";
int Base64Encode(const BYTE* pSrc, int nLenSrc, wchar_t* pDst, int nLenDst)
{
int nLenOut= 0;
while (nLenSrc > 0) {
if (nLenOut+4 > nLenDst) return(0); // error
// read three source bytes (24 bits)
BYTE s1= pSrc[0]; // (but avoid reading past the end)
BYTE s2= 0; if (nLenSrc>1) s2=pSrc[1]; //------ corrected, thanks to jprichey
BYTE s3= 0; if (nLenSrc>2) s3=pSrc[2];
DWORD n;
n = s1; // xxx1
n <<= 8; // xx1x
n |= s2; // xx12
n <<= 8; // x12x
n |= s3; // x123
//-------------- get four 6-bit values for lookups
BYTE m4= n & 0x3f; n >>= 6;
BYTE m3= n & 0x3f; n >>= 6;
BYTE m2= n & 0x3f; n >>= 6;
BYTE m1= n & 0x3f;
//------------------ lookup the right digits for output
BYTE b1 = Base64Digits[m1];
BYTE b2 = Base64Digits[m2];
BYTE b3 = Base64Digits[m3];
BYTE b4 = Base64Digits[m4];
//--------- end of input handling
*pDst++ = b1;
*pDst++ = b2;
if (nLenSrc >= 3) { // 24 src bits left to encode, output xxxx
*pDst++ = b3;
*pDst++ = b4;
}
if (nLenSrc == 2) { // 16 src bits left to encode, output xxx=
*pDst++ = b3;
*pDst++ = '=';
}
if (nLenSrc == 1) { // 8 src bits left to encode, output xx==
*pDst++ = '=';
*pDst++ = '=';
}
pSrc += 3;
nLenSrc -= 3;
nLenOut += 4;
}
// Could optionally append a NULL byte like so:
// *pDst++= 0; nLenOut++;
return(nLenOut);
}
Не обмануть кого угодно, но я скопировал функцию от here
Вот как я вызываю функцию:
wchar_t base64[256];
Base64Encode((const unsigned char *)UserLoginHash, lstrlenW(UserLoginHash) * 2, base64, 256);
Итак, почему в генерируемом хэше есть случайные null-байты или «пробелы»? Что нужно изменить, чтобы я мог избавиться от них?
Можете ли вы привести пример этих «нулевых байтов»? Как вы их наблюдаете? –
Код выглядит хорошо для меня. –
base64 не создает нулевые выходные символы. Если ваш вывод имеет в нем значения NULL, ваша реализация неверна. При этом 16-битные символы Unicode в диапазонах '0x00XX' и' 0xXX00' имеют в них нулевые байты. base64 работает с байтами, а не с символами, и он просто кодирует нулевые входные байты. –