Vital.sandbox
String

string.unpack

Shared

Unpacks values from a binary string according to a format


Syntax

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

Parameters

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

Returns

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

Examples

--Pack and unpack integers
local packed = string.pack("iii", 10, 20, 30)
local a, b, c = string.unpack("iii", packed)
engine.print(a, b, c) --10  20  30
--Unpack with position tracking
local packed = string.pack("ii", 100, 200)
local val1, pos = string.unpack("i", packed)
local val2 = string.unpack("i", packed, pos)
engine.print(val1, val2) --100  200
--Unpack fixed-size string
local packed = string.pack("c5", "hello")
local str = string.unpack("c5", packed)
engine.print(str) --hello
--Unpack zero-terminated string
local packed = string.pack("z", "world")
local str, nextPos = string.unpack("z", packed)
engine.print(str) --world
engine.print(nextPos) --7
--Unpack mixed types
local packed = string.pack("ifd", 42, 3.14, 2.718)
local i, f, d = string.unpack("ifd", packed)
engine.print(i, f, d) --42  3.14  2.718
--Unpack from specific position
local packed = string.pack("iii", 1, 2, 3)
local value = string.unpack("i", packed, 5)
engine.print(value) --2
--Little endian unpack
local packed = string.pack("<I4", 0x12345678)
local value = string.unpack("<I4", packed)
engine.print(string.format("0x%X", value)) --0x12345678
--Big endian unpack
local packed = string.pack(">I4", 0xABCDEF00)
local value = string.unpack(">I4", packed)
engine.print(string.format("0x%X", value)) --0xABCDEF00
--Unpack bytes
local packed = string.pack("BBB", 65, 66, 67)
local b1, b2, b3 = string.unpack("BBB", packed)
engine.print(string.char(b1, b2, b3)) --ABC
--Unpack double
local packed = string.pack("d", math.pi)
local value = string.unpack("d", packed)
engine.print(value) --3.14159...
--Unpack struct-like data
local packed = string.pack("c10i4f", "PlayerName", 100, 99.5)
local name, health, score = string.unpack("c10i4f", packed)
engine.print(name, health, score)
--Unpack string with length prefix
local packed = string.pack("s1", "hello")
local str = string.unpack("s1", packed)
engine.print(str) --hello
--Sequential unpacking
local packed = string.pack("zz", "first", "second")
local str1, pos = string.unpack("z", packed)
local str2 = string.unpack("z", packed, pos)
engine.print(str1, str2) --first  second
--Unpack network protocol header
local header = string.pack(">I2I2I4", 1, 2, 1024)
local version, type, length = string.unpack(">I2I2I4", header)
engine.print("Version:", version)
engine.print("Type:", type)
engine.print("Length:", length)
--Unpack boolean (stored as byte)
local packed = string.pack("b", 1)
local value = string.unpack("b", packed)
local bool = value ~= 0
engine.print(bool) --true
--Partial unpack
local packed = string.pack("i4i4i4i4", 1, 2, 3, 4)
local a, b, pos = string.unpack("i4i4", packed)
local c, d = string.unpack("i4i4", packed, pos)
engine.print(a, b) --1  2
engine.print(c, d) --3  4

On this page