Learned a couple of really cool pieces of syntax since yesterday and it's all about Binaries. Developers can directly manipulate strings of binary information in a natural way in Erlang. Say you have a server somewhere that is written in C++. In my case I used Qt as my socket provider. The server packs in code like this:
union CharToInt
{
quint32 number;
char buffer[ sizeof(quint32) ];
};
void packStringMessage(QString const& str, QTcpSocket& socket)
{
CharToInt c;
c.number = str.size();
socket.write(c.buffer, sizeof(quint32));
socket.write(str.toLocal8Bit()); //< Simple char-array.
}
This code is simple. It encodes a size of the string followed by the string itself. In Erlang you can simply do the following (once you have the message):
<<Size:32/little, Payload/binary>> = Message.
It will store the size of the message inside of Size and the rest of the binary data inside of Payload! What are the arguments all about? Well let's dissect:
<<Size:32/little, Payload/binary>> = Message.
Binaries are inside of << and >>. Whatever is inside is the makeup of the binary.
<<Size:32/little, Payload/binary>> = Message.
Notice that we can do the same pattern matching strategy as lists/function calls. I think this is the defining feature of Erlang.
<<Size:32/little, Payload/binary>> = Message.
The Size token is an identifier stating what variable the matching binary will be put inside of. The :32 specifies how many bits we are using. I'm taking a lot of liberties with this example; assuming quint32 fits in 4 bytes and that we are storing in little-endian notation. That's what the /little states to Erlang. The data that Size corresponds to should be 32 bits and in little-endian notation! Really convenient.
<<Size:32/little, Payload/binary>> = Message.
The final part to this is that the end of the binary (everything else) will be stored in Payload and should be binary data. I was surprised at how easy this was to decode binary messages in Erlang.
No comments:
Post a Comment