大佬教程收集整理的这篇文章主要介绍了如何在C中使用zlib库对websocket permessage-deflate进行编码和解码?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的代码:
char a[180] = "{\"type\":\"message\",\"chAnnel\":\"C04U0F9CW\",\"text\":\"TesTingmessage\",\"id\":757}"; char b[180]; char c[180]; int i; // deflate // zlib struct z_stream defstream; defstream.zalloc = Z_NULL; defstream.zfree = Z_NULL; defstream.opaque = Z_NULL; defstream.avail_in = (uint)strlen(a)+1; // size of input,String + terminator defstream.next_in = (Bytef *)a; // input char array defstream.avail_out = (uint)sizeof(b); // size of output defstream.next_out = (Bytef *)b; // output char array //deflateInit(&defstream,Z_SYNC_FLUSH); deflateInit2(&defstream,Z_DEFAULT_COMPRESSION,Z_DEFLATED,15,8,Z_DEFAULT_STRATEGY); deflate(&defstream,Z_SYNC_FLUSH); deflateEnd(&defstream); for(i=0;i<=(char*)defstream.next_out - b;i++) { printf("%X",(Bytef)b[i]); } printf("\n%s\n",(Bytef *)b); // This is one way of getTing the size of the output printf("Deflated size is: %lu\n",(char*)defstream.next_out - b);
我的输出是
kml@kml-VirtualBox:~/zlib-1.2.11/test$gcc test.c -lz && ./a.out 789CAA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD18A391B98841AB8593A873454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B5C0000FFFF2E x��V*�,HU�R�M-.NLOU�QJ�H��K��9���Y:�EKR+J�B!��%�y��pՙ)JV���� Deflated size is: 72 Inflate: 73 {"type":"message","chAnnel":"C04U0F9CW","text":"TesTingmessage","id":757}
所以我期待有效载荷让我这样
AA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD018A391B98841AB8593A8703454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B50000
This is the fiddler WebSocket traffic capture for that particular message
请帮助我获得正确的per-message-deflate编码.
Here is some more upgrade information GET https://127.0.0.1/websoc.html http/1.1 Host: mpmulti-yklu.slack-msgs.com User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip,deflate,br Sec-WebSocket-Version: 13 Sec-WebSocket-Extensions: permessage-deflate Sec-WebSocket-Key: FriWg0AWhiLhLXXnfJK8kA== Connection: keep-alive,Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket
响应
http/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: S2Q+O/tRM0/mIG//Er2hDdqD0eY= Sec-Websocket-Extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover X-Via: haproxy-ext90
int l = (uint)strlen(a); defstream.avail_in = l; // size of input,String + terminator
请尝试了解z_stream如何分配值检查代码,然后您将更好地了解这一点.
我想很多人都在尝试解码,而且他们没有为每个消息放弃获得适当的价值.
“789CAA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD18A391B98841AB8593A873454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B5C0000FFFF2E”
这里789C是标题和0000FFFF或根据你的代码(00FFFF)是deflate消息的预告片.这里0代表00,因为你的输出是打印一个’0’而不是’00’.因为额外的一个尺码,你得到额外的5C.当您尝试下面的代码时,Thye’2E’也将被移除
int d = memcmp(msgend,&b[defstream.@R_97_10586@l_out - 4],4) ? 0 : 4; for(i=0;i<defstream.@R_97_10586@l_out - d;i++) { printf("%2X",(Bytef)b[i]); }
所以你的预期答案是
“AA562AA92C4855B252CA4D2D2E4E4C4F55D2514ACE48CCCB4BCD018A391B98841AB8593A8703454B522B4A804221A9C5259979E9BE70D599294A56E6A6E6B50000”
根据您的输出,2个字节为0,因此根据您的代码,它将为“00”并且您的输出跟随打印每个半字节(半字节).
请尝试这对我有用,我现在能够正确解码.
以上是大佬教程为你收集整理的如何在C中使用zlib库对websocket permessage-deflate进行编码和解码?全部内容,希望文章能够帮你解决如何在C中使用zlib库对websocket permessage-deflate进行编码和解码?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。