Packing and unpacking unsigned integers of arbitrary size as binary strings

I see there’s a ‘w’ option to pack for packing arbitrary sized
unsigned integers in BER compressed format. However I need to
pack/unpack binary strings as simple binary byte strings.

The results of my own needs have been gemmified as the bignumpack gem.
See
https://github.com/astounding/bignumpack/blob/master/lib/bignumpack.rb

Are there alternatives that may be more efficient, or if I’ve missed
something obvious.

I resorted to splitting the binary string into 64-bit sized chunks and
using the ‘Q’ packing option (except where I couldn’t determine
endianness, where I resorted to using the 32-bit network-order ‘N’
packing option).

While I tried to be endian-architecture friendly, I don’t have a
big-endian box with Ruby on it handy to test and would appreciate it
if anyone on a big-endian box would let me know if the tests fail.

Aaron out.

Aaron D. Gifford wrote in post #991376:

Are there alternatives that may be more efficient, or if I’ve missed
something obvious.

I’d just do this:

num = 12345678901234567890
=> 12345678901234567890

hex = num.to_s(16)
=> “ab54a98ceb1f0ad2”

hex.size
=> 16

[hex].pack(“H*”)
=> “\253T\251\214\353\037\n\322”

Add an extra ‘0’ to the left of hex if it’s an odd number of characters.

Oh, I forgot to do the reverse:

bin = “\253T\251\214\353\037\n\322”
=> “\253T\251\214\353\037\n\322”

bin.unpack(“H*”).first.to_i(16)
=> 12345678901234567890

Nice, using the conversion via hex string is faster for
number-to-binary-string conversion, but slower in string-to-number
conversion on my system. I think I’ll update and use it for
number-to-string.

Thanks!

Aaron out.