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