jerome@65: local M, sbyte, schar, sgsub, sformat = {}, string.byte, string.char, string.gsub, string.format jerome@65: local inf, nan = math.huge, math.huge-math.huge jerome@65: jerome@65: local hexbin = {} for i=0,255 do jerome@65: local h, b = sformat("%02x", i), schar(i) jerome@65: hexbin[sformat("%02X", i)], hexbin[h], hexbin[b] = b, b, h jerome@65: end jerome@65: jerome@65: function M.uint32_le(s, pos) jerome@65: local d, c, b, a = sbyte(s, (pos or 0)+1, (pos or 0) + 4) jerome@65: return a*256^3 + b*256^2 + c*256 + d jerome@65: end jerome@65: function M.uint16_le(s, pos) jerome@65: local b,a = sbyte(s, (pos or 0)+1, (pos or 0) + 2) jerome@65: return a*256 + b jerome@65: end jerome@65: function M.uint32_be(s, pos) jerome@65: local a,b,c,d = sbyte(s, (pos or 0)+1, (pos or 0) + 4) jerome@65: return a*256^3 + b*256^2 + c*256 + d jerome@65: end jerome@65: function M.uint40_be(s, pos) jerome@65: local a, b, c, d, e = sbyte(s, (pos or 0)+1, (pos or 0) + 5) jerome@65: return a*256^4 + b*256^3 + c*256^2 + d*256 + e jerome@65: end jerome@65: function M.float32_le(s, pos) jerome@65: local a, b, c, d = sbyte(s, (pos or 0) + 1, (pos or 0) + 4) jerome@65: local s, e, f = d > 127 and -1 or 1, (d % 128)*2 + (c > 127 and 1 or 0), a + b*256 + (c % 128)*256^2 jerome@65: if e > 0 and e < 255 then jerome@65: return s * (1+f/2^23) * 2^(e-127) jerome@65: else jerome@65: return e == 0 and (s * f/2^23 * 2^-126) or f == 0 and (s * inf) or nan jerome@65: end jerome@65: end jerome@65: function M.int32_le(s, pos) jerome@65: local d, c, b, a = sbyte(s, (pos or 0)+1, (pos or 0) + 4) jerome@65: return a*256^3 + b*256^2 + c*256 + d - (a < 128 and 0 or 2^32) jerome@65: end jerome@65: jerome@65: function M.to_le32(n) jerome@65: local n = n % 2^32 jerome@65: return schar(n % 256, (n / 256) % 256, (n / 256^2) % 256, (n / 256^3) % 256) jerome@65: end jerome@65: function M.to_be40(n) jerome@65: local n = n % 2^40 jerome@65: return schar((n / 256^4) % 256, (n / 256^3) % 256, (n / 256^2) % 256, (n / 256) % 256, n % 256) jerome@65: end jerome@65: jerome@65: function M.to_bin(hs) jerome@65: return hs and sgsub(hs, "%x%x", hexbin) jerome@65: end jerome@65: function M.to_hex(bs) jerome@65: return bs and sgsub(bs, ".", hexbin) jerome@65: end jerome@65: jerome@65: return M