現在、WebSocketと通信できるC++サーバを稼働させようとしています。 HandShakeはいくつかのステップから成り立ち、私は最後のものでは成功しません。Sha1のC++ Base64 - WebSocketハンドシェイク
最初の手順では、SHA1でエンコードされた文字列を生成し、正しく16進文字列を取得しました。 (例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文字の16進数文字列を渡す代わりに、20文字のバイナリ表現を渡す必要があります。
私はopenssl SHA1がバイナリ表現を返しますが、特定の理由でライブラリを使用できないことは知っています。私が使用するSHA1ライブラリは、エンコードされた出力をint配列に置きます。今
std::ostringstream oss;
oss << std::setfill('0');
for (int i = 0; i < 5; ++i) {
oss << std::setw(8) << std::hex << result[i];
}
大きな問題:私はこのような六角よりも、この変換
result[0] = 3011137324
result[1] = 3227668246
result[2] = 2432058886
result[3] = 3476576581
result[4] = 2998846698
:出力は、この(IETF例)のように見えます。私はどのようにバイナリに私の16進文字列を変換できますか?
ありがとうございます。 マルクス
EDIT
誰かがコードに関心がある場合: https://github.com/MarkusPfundstein/C---Websocket-Server
私は非常に試してみます –
非常に申し訳ありませんが、それは動作しません:(結果は5の配列ですので、私は列挙子をi <5にする必要はありませんか?それはまた非常に奇妙な出力を生成します –
申し訳ありません、私はバイトオーダーに関する私の注意を参照してください。どのように出力が奇妙ですか? –