Module:Sandbox/Erutuon/UTF-8
< Module:Sandbox | Erutuon
Jump to navigation
Jump to search
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))
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