File: hex.lua

package info (click to toggle)
libquvi-scripts 0.9.20131130-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,828 kB
  • sloc: sh: 11,744; ansic: 2,587; makefile: 226
file content (107 lines) | stat: -rw-r--r-- 2,801 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
-- libquvi-scripts v0.9.20131130
-- Copyright (C) 2013  Toni Gundogdu <legatvs@gmail.com>
--
-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
--
-- This program is free software: you can redistribute it and/or
-- modify it under the terms of the GNU Affero General Public
-- License as published by the Free Software Foundation, either
-- version 3 of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Affero General Public License for more details.
--
-- You should have received a copy of the GNU Affero General
-- Public License along with this program.  If not, see
-- <http://www.gnu.org/licenses/>.
--

local M = {}

-- Returns an array of the numerical codes of the hexadecimal string.
function M.to_arr(s)
  if not (#s % 2 ==0) then
    error(string.format('%s: invalid hexstring', s))
  end
  local B = require 'bit'
  local r = {}
  s:gsub('%x%x', function(n)
      table.insert(r, B.tobit(tonumber(n,16)))
    end)
  return r
end

-- Returns an array of the internal numerical codes of the characters.
function M.to_bytes(s)
  local r = {}
  s:gsub('.', function(c)
      table.insert(r, c:byte(1))
    end)
  return r
end

-- Returns a hexadecimal string created from the array of the internal
-- numberical codes of the characters.
function M.from_bytes(b)
  local B = require 'bit'
  local r = {}
  for _,v in pairs(b) do
    table.insert(r, B.tohex(v,2))
  end
  return table.concat(r)
end

-- Data to a hexadecimal string.
function M.to_hex(s)
  local t = type(s)
  if t == 'string' then
    return M.from_bytes(M.to_bytes(s))
  elseif t == 'table' then
    return M.from_bytes(s)
  else
    error(string.format('invalid type: %s', t))
  end
end

-- Returns a string of the internal numerical codes created from
-- the hexadecimal string or the array of numerical codes of the
-- hexadecimal string.
function M.to_str(s)
  local a,t = type(s)
  if type(s) == 'string' then
    a = M.to_arr(s)
  elseif type(s) == 'table' then
    a = s
  else
    error(string.format('invalid type: %s', t))
  end
  local r = {}
  for _,v in pairs(a) do
    table.insert(r, string.char(v))
  end
  return table.concat(r)
end

--[[
--
-- tests
--

function test_eq(t,r,e)
  if not (r == e) then error(string.format('%s: failed', t)) end
end

-- to_hex(string)
test_eq('test/to_hex #1', M.to_hex({0x0b,0x02,0x04,0x08,0xa}), '0b0204080a')
test_eq('test/to_hex #2', M.to_hex('foo'), '666f6f')

-- to_str
test_eq('test/to_str #1', M.to_str({0x66,0x6f,0x6f}), 'foo')
test_eq('test/to_str #2', M.to_str('666f6f'), 'foo')
]]--

return M

-- vim: set ts=2 sw=2 tw=72 expandtab: