I am writing server and client based on WebSocket protocol.
Server is made using Python and Twisted.
Right now I can send binary data from server to client and back, only problem is that, according to some sources, endianness of binary data sent from browser is based on machine endianness. I want to make sure, is it true?
If it’s true, then should I somehow check what endianness client has and read/send data from/to him using his endianness? What is the best way to check client endianness, just send from client
var view_buffer = new UInt8Array(new ArrayBuffer(1));
view_buffer[0] = 1;
this data, and check on server if it returns 1 or 128?
To check endianess you’d need to send at least a two byte value.
You can’t check just by sending a single byte because the bit-level endianess has already been sorted out for you at that point.
Hence the endianess only matters for purposes of byte swapping (if required) and if you’re trying to pack individual bits using endian-specific rules, such as when you use bitfields in C.
If your question relates to your own messages carried within WebSocket payloads, the usual process is to choose a byte order yourself, and then do whatever packing or unpacking you have to do to convert from the native byte order to your preferred byte order. Most protocols I know of use big-endian, aka “network order”.
So, if you have a 16 bit value, convert it into two 8-bit bytes yourself with shifts and bitwise operators, and then send the top byte first followed by the second byte. At the server side, reverse that process. Most server side languages make it pretty easy to byte-swap values from network order to native byte order.