Module:Sandbox/Erutuon/UTF-8

From blackwiki
< Module:Sandbox‎ | Erutuon
Revision as of 06:52, 17 September 2017 by blackwiki>Erutuon (grab binary digit)
Jump to navigation Jump to search

An experiment with printing binary digit representations of characters.

Usage

01100001 01111110 11000010 10100001 11000011 10100001 11001110 10110001 11100001 10111110 10110000 11110000 10100000 10000000 10000000

digits 3 and 4 in 11100001: 1, 0



local p = {}

local bit = require("bit32")
local band = bit.band
local rshift = bit.rshift

local function binary(stringBinary)
	return tonumber(stringBinary, 2)
end

-- Assumes in a single byte, with highest digit first.
local function digitAt(number, index)
	return band(rshift(number, 8 - index), 1)
end

local function getBits(byte)
    local t = {}
    for bit = 8, 1, -1 do
        t[bit] = band(byte, 1)
        byte = rshift(byte, 1)
    end
    return t
end

-- mw.log(table.concat(getBits(rshift(binary("11100001"), 8 - 3))))

local function iterBytes(str, func)
    local out = {}
    for i = 1, #str do
        table.insert(out, func(string.byte(str, i)))
    end
    return out
end

function p.show(frame)
	local str = frame.args[1] or "ᾰ̓τῑμᾰ́ζω"
    return table.concat(
        iterBytes(
            str,
            function(byte)
                return table.concat(getBits(byte))
            end
        ),
        " "
    ) .. "\n\n" .. "digits 3 and 4 in 11100001: " .. digitAt(binary("11100001"), 3) .. ", " .. digitAt(binary("11100001"), 4)
end

return p