В настоящее время я пытаюсь запустить сервер С++, который может взаимодействовать с WebSocket. Рукопожатие состоит из пары шагов, и у меня не получается с последним.
Первым шагом является создание строки в кодировке SHA1, и я успешно получил правильную шестнадцатеричную строку. (Пример http://en.wikipedia.org/wiki/WebSocket и http://tools.ietf.org/html/rfc6455).
Мой вывод в обоих случаях такой же, как указано в документации:
Wikipedia: 1d 29 ab 73 4b 0c 95 85 24 00 69 a6 e4 e3 e9 1b 61 da 19 69
My Server: 1d 29 ab 73 4b 0c 95 85 24 00 69 a6 e4 e3 e9 1b 61 da 19 69
IETF Docu: b3 7a 4f 2c c0 62 4f 16 90 f6 46 06 cf 38 59 45 b2 be c4 ea
My Server: b3 7a 4f 2c c0 62 4f 16 90 f6 46 06 cf 38 59 45 b2 be c4 ea
Так что это правильно. Когда я теперь делаю кодировку Base64, я прихожу к следующим результатам:
Wikipedia: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
My Server: MWQyOWFiNzM0YjBjOTU4NTI0MDA2OWE2ZTRlM2U5MWI2MWRhMTk2OQ==
IETF Docu: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
My Server: YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==
А это совсем другое. Я подтвердил, что мой алгоритм Base64 работает с некоторыми онлайн-конвертерами, и все они выдавали результат, который делал мой сервер. Итак, проблема заключается в формате ввода. Я нашел запись на форуме javascript, где у одного была такая же проблема, и ответ заключался в том, что вместо передачи 40-символьной шестнадцатеричной строки мы должны передать 20-символьное двоичное представление.
Я знаю, что openssl SHA1 возвращает двоичное представление, но я не могу использовать библиотеку по определенным причинам. Библиотека SHA1, которую я использую, помещает закодированный вывод в массив int. Результат выглядит следующим образом (пример IETF):
result[0] = 3011137324
result[1] = 3227668246
result[2] = 2432058886
result[3] = 3476576581
result[4] = 2998846698
Я конвертирую это, чем в шестнадцатеричный код следующим образом:
std::ostringstream oss;
oss << std::setfill('0');
for (int i = 0; i < 5; ++i) {
oss << std::setw(8) << std::hex << result[i];
}
Теперь большой вопрос. Как я могу преобразовать свою шестнадцатеричную строку в двоичную?
Заранее большое спасибо . Маркус
ИЗМЕНИТЬ
Если кому-то интересен код: https://github.com/MarkusPfundstein/C---Websocket-Server