In Ruby, especially while writing low-level protocols, you may have encountered Array#pack()
and/or String#unpack()
. If you’ve ever experimented with them, they may seem mysterious; they take a cryptic string as a parameter (maybe something like C4
or w*
) and seem to return gibberish (or, conversely, convert gibberish into something humans can understand). I’m not going to go into tons of detail, nor am I going to cover every format that these methods accept, but I’ll cover a few that I’ve used.
What led me to writing this post was actually some recent experimenting that I’ve been doing with Crystal. I’m trying my hand at writing a simple BER parser/encoder as a part of my journey to writing an LDAP library for Crystal. The lack of an LDAP library is honestly the biggest reason I haven’t used Crystal for more things. Since BER is a binary method of encoding, the Ruby LDAP BER code uses a ton of Array#pack()
and String#unpack()
. Unfortunately, Crystal doesn’t have analogous methods for its Array
class or String
struct so I’ve had to write my own.
Here, I’ll describe a few of the formats supported by #pack
and write some compatible examples in Crystal.
Continue reading Rewriting Ruby’s #pack and #unpack Methods in Crystal