WebSocket协议二进制数据字节序

时间:2013-01-31 21:25:43

标签: javascript python websocket endianness

我正在编写基于WebSocket协议的服务器和客户端。

服务器是使用Python和Twisted制作的。

现在我可以将二进制数据从服务器发送到客户端并返回,唯一的问题是,根据一些消息来源,从浏览器发送的二进制数据的字节顺序是基于机器字节顺序的。我想确定,这是真的吗?

如果这是真的,那么我应该以某种方式检查端点客户端有什么,并使用他的字节序读取/向他发送数据?检查客户端字节顺序的最佳方法是什么,只需从客户端发送

var view_buffer = new UInt8Array(new ArrayBuffer(1));
view_buffer[0] = 1;

此数据,并检查服务器是否返回1或128?

5 个答案:

答案 0 :(得分:8)

根据RFC 6455

  

多字节长度数量以网络字节顺序表示。

网络字节顺序是大端。服务器和客户端都应该使用这个字节顺序,无论它们的本机顺序是什么。

在Python中,struct module可用于确保使用'>'说明符的正确字节顺序。我不确定如何在Javascript中完成。

答案 1 :(得分:1)

字节顺序仅与由多个字节组成的数据类型相关。因为你正在处理一组uint8字节序并不重要。

答案 2 :(得分:1)

要检查endianess,您需要发送至少两个字节的值。

您不能仅通过发送单个字节来检查,因为此时已经为您整理了位级字节序。

因此,endianess仅用于字节交换(如果需要)的目的,并且如果您尝试使用特定于字节的规则打包单个位,例如在C中使用位域时< / p>

如果您的问题与您自己在WebSocket有效负载中携带的消息有关,通常的过程是自己选择一个字节顺序,然后执行任何打包或解包,您需要做的是从本机字节顺序转换为您的首选字节顺序。我所知道的大多数协议都使用big-endian,即“网络秩序”。

因此,如果您有一个16位值,请使用移位和按位运算符将其转换为两个8位字节,然后先发送顶部字节,然后再发送第二个字节。在服务器端,反转该过程。大多数服务器端语言都可以很容易地将值从网络顺序字节交换为本机字节顺序。

答案 3 :(得分:0)

RFC 6455中有关于关闭消息顺序的说明:

  

如果有正文,则正文的前两个字节必须是一个2字节无符号整数(按网络字节顺序),表示第7.4节中定义的值/代码/的状态代码。

因此,如果您要在WS消息中使用二进制数据,通常会希望您使用大端。我认为它不是强制性的,通过。

如果您想要允许任何一个,您可以做的是在邮件开头添加一个幻数。那将是2个字节,它们是不同的,例如((&#39; M&#39;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&#8;&#39; G&#39;)。如果你收到&#34; M&#34;然后&#34; G&#34;,它的大端。如果您收到&#34; G&#34;然后&#34; M&#34;,它的小端。现在每条消息都会告诉你它的字节顺序。不再猜测工作了。

正如Mark Ransom在评论中指出的那样,可以从JavaScript以任一端发送数据,但是必须交换所有字节会很烦人。因此,具有指示当前字节序的2字节值通常是解决该问题的非常好的解决方案。接收数据的服务器可以检查这两个字节并相应地交换short,int,long int数据。

答案 4 :(得分:0)

让客户端向服务器发送126个字节或更多(但小于65535)(例如200)的文本消息。 Payload_Length字段将为126。

然后检查接下来的两个字节的扩展有效载荷长度,以确定客户端是否以大字节序发送(可能),或者客户端是否混乱并以小字节序格式发送。

对于大字节序,8位有效载荷长度旁边的字节(应该为126,以指示接下来的两个字节实际上包含实际有效载荷长度)应为16位长度的最高有效字节。 / p>