我正在编写基于WebSocket协议的服务器和客户端.。
服务器是使用Python和Twisted制作的。
目前,我可以将二进制数据从服务器发送到客户端和客户端,唯一的问题是,根据某些来源,浏览器发送的二进制数据是基于机器endianness的。我想确定这是真的吗?
如果是真的,那么我是否应该以某种方式检查endianness客户端拥有什么,并使用他的endianness从/向他读取/发送数据?检查客户端状态的最佳方法是什么,只需从客户端发送
var view_buffer = new UInt8Array(new ArrayBuffer(1));
view_buffer[0] = 1;这些数据,并检查服务器是否返回1或128?
发布于 2013-01-31 21:31:59
要检查endianess,需要发送至少两个字节的值。
您不能仅仅通过发送一个字节来进行检查,因为在这一点上已经为您排序了位级sending。
因此,只有在字节交换(如果需要的话)和试图使用特定于endian的规则打包单个位时,例如在C中使用位字段时,才需要使用endian。
如果您的问题涉及您自己在WebSocket有效负载中携带的消息,通常的过程是自己选择一个字节顺序,然后执行从本机字节顺序转换为首选字节顺序所必须做的任何打包或解压缩。我所知道的大多数协议都使用大端,也就是“网络秩序”。
因此,如果您有一个16位的值,将其转换为两个8位字节,自己使用移位和位运算符,然后发送顶部的字节,然后是第二个字节。在服务器端,反转该进程。大多数服务器端语言使得从网络顺序到本机字节顺序的字节交换值变得非常容易。
发布于 2013-01-31 21:31:04
根据RFC 6455
多字节长度量以网络字节顺序表示。
网络字节顺序是大端。服务器和客户端都应该使用这个字节顺序,不管它们的本机顺序是什么。
在模块中,可以使用'>'说明符来确保正确的字节顺序。我不知道在Javascript里会怎么做。
发布于 2013-01-31 21:28:27
Endianess只适用于由多个字节组成的数据类型。因为您使用的是一个uint8数组,所以不重要。
https://stackoverflow.com/questions/14635427
复制相似问题