我已经用c++写了一个支持常规网站的基本HTTP服务器,但我现在正试图扩展它以支持websockets。所有的网络和解析都是由我自己的代码完成的,所以没有库——除了我复制并粘贴了一些用于计算SHA1和转换为base64的代码。
我正在阅读一些描述如何握手传入websocket连接的指南,例如:http://www.altdev.co/2012/01/23/writing-your-own-websocket-server/和http://enterprisewebbook.com/ch8_websockets.html
我被困在服务器需要从客户端报头中获取密钥并将魔法字符串附加到其上,然后用SHA1散列,用base64编码,并将结果作为接受报头的一部分发送回去的部分。
给我麻烦的具体部分是键中的'==',以及服务器发回的结果字符串中的'='。我找不到任何说明如何处理这些的信息——我是在向其添加魔法字符串之前从键中删除==,还是继续使用它们?此外,我无法弄清楚最终服务器答案末尾的'='来自哪里-以及为什么服务器的答案只有一个'='而客户端的密钥有两个'='
最后,我很困惑为什么服务器使用的魔法字符串是base16,但客户端浏览器发送的密钥已经是base64了——我需要在附加它之前将服务器字符串转换为base64吗,或者这无关紧要?
当我转换为base64时,我是否将其转换为每个ascii符号都是数字(因此字符串中的'A'将是10),或者我是否将整个字符串的二进制表示转换为表示原始二进制但具有base64数字的字符串?
很抱歉,如果这是一个愚蠢的问题,但我不做太多的web编程,所以当文章假设读者知道一些关于信息的一部分时,它会让我感到困惑。
伪代码:
key_decoded = base64_decode(key64)
magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
response = SHA1(append(key_decoded, magic))
response_encoded = base64_encode(response)
base64编码数据末尾的'='用于将数据填充到所需的长度。你不需要用它做任何事情。(参见这里:为什么base64编码的字符串在末尾有一个=符号)不同长度的输入数据可能需要不同数量的填充,因此在您的示例中,两个编码值具有不同数量的填充。
转换为base64时,不需要对输入数据做任何假设,它只是输入字节。不要将'a'转换为10(您似乎认为ascii字符应该表示十六进制数字,这是不相关的)