Module:Sandbox/Erutuon/UTF-8

From blackwiki
< Module:Sandbox‎ | Erutuon
Revision as of 07:00, 17 September 2017 by blackwiki>Erutuon (get digit in binary number (or string representation of binary number, though it's kinda silly))
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

-- Converts a string representing a number in binary base to a Lua number.
local function binary(stringBinary)
	return tonumber(stringBinary, 2)
end

-- Assumes in a single byte, with highest digit first.
local function digitAt(number, index)
	if type(number) == "string" then
		number = binary(number)
	end
	return band(rshift(number, 8 - index), 1)
end

-- Returns a table containing bits in a byte, in order.
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))))

-- Do something to each byte in a string; put the result in a table.
local function iterBytes(str, func)
	local out = {}
	for i = 1, #str do
		table.insert(out, func(string.byte(str, i)))
	end
	return out
end

local function printBytes(str)
	return table.concat(
		iterBytes(
			str,
			function(byte)
				return table.concat(getBits(byte))
			end
		),
		" "
	)
end

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

return p