Whenever I'm working with binary data in Python, I inevitably find myself using the binascii module. The methods hexlify and unhexlify make it extremely easy to convert between binary data and the corresponding hexadecimal string.
I thought it would be fun to write a subset of Python's binascii module in Ruby and Lua.
binascii.rb
module Binascii
  def self.hexlify(s)
    a = []
    s.each_byte do |b|
      a << sprintf('%02X', b)
    end
    a.join
  end
  def self.unhexlify(s)
    a = s.split
    return a.pack('H*')
  end
end
binascii_example.rb
#!/usr/bin/env ruby
require 'binascii'
puts Binascii.hexlify('123')
puts Binascii.unhexlify('313233')
binascii_example.rb output
313233 123
binascii.lua
-- module setup
local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M
-- import section
local error = error
local string = string
local table = table
local tonumber = tonumber
-- no more external access after this point
setfenv(1, M)
---
-- Converts a string of bytes to a hexadecimal string
function hexlify(s)
    local a = {}
    for i=1,#s do
        local c = string.sub(s,i,i)
        local byte = string.byte(c)
        table.insert(a, string.format('%02X', byte))
    end
    return table.concat(a)
end
---
-- Converts a hexadecimal string to a string of bytes
function unhexlify(s)
    if #s % 2 ~= 0 then
        error('unhexlify: hexstring must contain even number of digits')
    end
    local a = {}
    for i=1,#s,2 do
        local hs = string.sub(s, i, i+1)
        local code = tonumber(hs, 16)
        if not code then
            error(string.format("unhexlify: '%s' is not avalid hex number", hs))
        end
        table.insert(a, string.char(code))
    end
    return table.concat(a)
end
binascii_example.lua
#!/usr/bin/env lua
local binascii = require 'binascii'
print(binascii.hexlify('123'))
print(binascii.unhexlify('313233'))
binascii_example.lua output
313233 123
No comments:
Post a Comment