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("info", a, b, c) --10  20  30
Unpack values using 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("info", val1, val2) --100  200
Unpack a fixed-size string
local packed = string.pack("c5", "hello")
local str = string.unpack("c5", packed)

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

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

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

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

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

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

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

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

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

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

engine.print("info", str1, str2) --'first'  'second'
Unpack a network protocol header
local header = string.pack(">I2I2I4", 1, 2, 1024)
local version, type, length = string.unpack(">I2I2I4", header)

engine.print("info", "Version:", version)
engine.print("info", "Type:", type)
engine.print("info", "Length:", length)
Unpack a boolean stored as a byte
local packed = string.pack("b", 1)
local value = string.unpack("b", packed)
local bool = value ~= 0

engine.print("info", bool) --true
Partially unpack a binary string in two passes
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("info", a, b) --1  2
engine.print("info", c, d) --3  4

On this page