WebSocket协议二进制数据字节序

7 投票
5 回答
4459 浏览
提问于 2025-04-17 14:22

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

服务器是用Python和Twisted搭建的。

现在我可以在服务器和客户端之间发送二进制数据,唯一的问题是,根据一些资料,从浏览器发送的二进制数据的字节序是根据机器的字节序来决定的。我想确认一下,这是真的吗?

如果是真的,那我是不是应该检查一下客户端的字节序,然后根据他的字节序来读取和发送数据?检查客户端字节序的最佳方法是什么?是不是可以从客户端发送一些数据,

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

然后在服务器上检查它返回的是1还是128?

5 个回答

1

字节序(Endianess)只和那些由多个字节组成的数据类型有关。如果你在处理的是一个由uint8(单字节无符号整数)组成的数组,那么字节序就不重要了。

9

根据RFC 6455的说明:

多字节长度的数量是按照网络字节顺序来表示的。

网络字节顺序是大端模式。这意味着无论服务器和客户端本身的字节顺序是什么,它们都应该使用这种大端模式。

在Python中,可以使用struct模块来确保使用正确的字节顺序,方法是使用'>'这个标识符。不过,我不太确定在Javascript中该怎么做。

1

要检查字节序,你至少需要发送一个两字节的值。

你不能只发送一个字节来检查,因为在这个时候,位级的字节序已经被处理好了。

所以,字节序主要是为了字节交换(如果需要的话)以及在使用特定字节序规则打包单独的位时才重要,比如在C语言中使用位域时。

如果你的问题是关于在WebSocket负载中传输你自己的消息,通常的做法是自己选择字节顺序,然后进行必要的打包或解包,将本地字节顺序转换为你想要的字节顺序。我知道的大多数协议使用的是大端字节序,也就是“网络顺序”。

所以,如果你有一个16位的值,自己用位移和按位运算符把它转换成两个8位的字节,然后先发送高字节,再发送低字节。在服务器端,反向处理这个过程。大多数服务器端语言都很容易将网络顺序的值转换为本地字节顺序。

撰写回答