WebSocket协议二进制数据字节序
我正在基于WebSocket协议编写服务器和客户端。
服务器是用Python和Twisted搭建的。
现在我可以在服务器和客户端之间发送二进制数据,唯一的问题是,根据一些资料,从浏览器发送的二进制数据的字节序是根据机器的字节序来决定的。我想确认一下,这是真的吗?
如果是真的,那我是不是应该检查一下客户端的字节序,然后根据他的字节序来读取和发送数据?检查客户端字节序的最佳方法是什么?是不是可以从客户端发送一些数据,
var view_buffer = new UInt8Array(new ArrayBuffer(1));
view_buffer[0] = 1;
然后在服务器上检查它返回的是1还是128?
5 个回答
1
字节序(Endianess)只和那些由多个字节组成的数据类型有关。如果你在处理的是一个由uint8(单字节无符号整数)组成的数组,那么字节序就不重要了。
1
要检查字节序,你至少需要发送一个两字节的值。
你不能只发送一个字节来检查,因为在这个时候,位级的字节序已经被处理好了。
所以,字节序主要是为了字节交换(如果需要的话)以及在使用特定字节序规则打包单独的位时才重要,比如在C语言中使用位域时。
如果你的问题是关于在WebSocket负载中传输你自己的消息,通常的做法是自己选择字节顺序,然后进行必要的打包或解包,将本地字节顺序转换为你想要的字节顺序。我知道的大多数协议使用的是大端字节序,也就是“网络顺序”。
所以,如果你有一个16位的值,自己用位移和按位运算符把它转换成两个8位的字节,然后先发送高字节,再发送低字节。在服务器端,反向处理这个过程。大多数服务器端语言都很容易将网络顺序的值转换为本地字节顺序。