util.string.unpack

Shared

Unpacks values from a binary string according to a format


Syntax

local ..., next_pos = util.string.unpack(
    format,
    input,
    start_at = 1
)

Parameters

TypeNameDescription
stringformatFormat string - same format as used in util.string.pack
stringinputBinary string containing packed data
intstart_atStarting position in the string

Returns

TypeNameDescription
any...Unpacked values
intnext_posIndex of the first unread byte in the string

Examples

Pack and unpack integers
local packed = util.string.pack("iii", 10, 20, 30)
local a, b, c = util.string.unpack("iii", packed)

core.engine.print("info", a, b, c) -- 10  20  30
Unpack values using position tracking
local packed = util.string.pack("ii", 100, 200)
local val1, pos = util.string.unpack("i", packed)
local val2 = util.string.unpack("i", packed, pos)

core.engine.print("info", val1, val2) -- 100  200
Unpack a fixed-size string
local packed = util.string.pack("c5", "hello")
local str = util.string.unpack("c5", packed)

core.engine.print("info", str) -- 'hello'
Unpack a zero-terminated string
local packed = util.string.pack("z", "world")
local str, nextPos = util.string.unpack("z", packed)

core.engine.print("info", str) -- 'world'
core.engine.print("info", nextPos) -- 7
Unpack mixed types from a binary string
local packed = util.string.pack("ifd", 42, 3.14, 2.718)
local i, f, d = util.string.unpack("ifd", packed)

core.engine.print("info", i, f, d) -- 42  3.14  2.718
Unpack from a specific position
local packed = util.string.pack("iii", 1, 2, 3)
local value = util.string.unpack("i", packed, 5)

core.engine.print("info", value) -- 2
Unpack a little endian value
local packed = util.string.pack("<I4", 0x12345678)
local value = util.string.unpack("<I4", packed)

core.engine.print("info", util.string.format("0x%X", value)) -- '0x12345678'
Unpack a big endian value
local packed = util.string.pack(">I4", 0xABCDEF00)
local value = util.string.unpack(">I4", packed)

core.engine.print("info", util.string.format("0x%X", value)) -- '0xABCDEF00'
Unpack raw bytes into characters
local packed = util.string.pack("BBB", 65, 66, 67)
local b1, b2, b3 = util.string.unpack("BBB", packed)

core.engine.print("info", util.string.char(b1, b2, b3)) -- 'ABC'
Unpack a double precision float
local packed = util.string.pack("d", util.math.pi)
local value = util.string.unpack("d", packed)

core.engine.print("info", value) -- 3.14159...
Unpack struct-like player data
local packed = util.string.pack("c10i4f", "PlayerName", 100, 99.5)
local name, health, score = util.string.unpack("c10i4f", packed)

core.engine.print("info", name, health, score)
Unpack a string with a length prefix
local packed = util.string.pack("s1", "hello")
local str = util.string.unpack("s1", packed)

core.engine.print("info", str) -- 'hello'
Unpack multiple strings sequentially
local packed = util.string.pack("zz", "first", "second")
local str1, pos = util.string.unpack("z", packed)
local str2 = util.string.unpack("z", packed, pos)

core.engine.print("info", str1, str2) -- 'first'  'second'
Unpack a boolean stored as a byte
local packed = util.string.pack("b", 1)
local value = util.string.unpack("b", packed)
local bool = value ~= 0

core.engine.print("info", bool) -- true
Partially unpack a binary string in two passes
local packed = util.string.pack("i4i4i4i4", 1, 2, 3, 4)
local a, b, pos = util.string.unpack("i4i4", packed)
local c, d = util.string.unpack("i4i4", packed, pos)

core.engine.print("info", a, b) -- 1  2
core.engine.print("info", c, d) -- 3  4

On this page