Explain lua’s string and hex data (hexadecimal)#
Thinking Conversion of String and hex (Hexadecimal Number) in Lua
Background#
LuatOS When dealing with communications, data processing is always involved, such:
socket:send(data)
socket:recv(1024)
spi.send(data)
spi.recv(16)
uart.write(1, data)
These methods either send string or return string instead of using byte[]/char[] of other programming languages, because lua does not have byte and char
What is hex#
Let’s look at the form of hex first.
The ASCII code for the string "1" is 0x31
The ASCII code for the string "2" is 0x32
0x3132 -- Value Identification
"3132" -- hex String, this HEX string for people to see
"12" -- Equivalent to 0x 3132 lua string
{0x31, 0x32} -- lua Array(table)
[0x31, 0x32] -- java/c/c++of byte[]/char[]
Data Conversion#
Write 0x 3132 to uart, socket/spi is the same
// Method 1, byte-by-byte description using string.char
local data = string.char(0x31, 0x32)
uart.write(id, data)
// Method 2, using string.fromHex, passing in a hex string of multiple length of 2
local data = string.fromHex("3132")
uart.write(id, data)
// Method 3, using the pack library, H represents the number of 2 bytes of symbols, I represents the number of 4 bytes of unsigned, wiki can be checked
local data = pack.pack("H", 0x3132)
uart.write(id, data)
Convert the data read by the socket to a numerical value, and the same applies to uart/spi.
local re, data = socket:recv(1000) -- Wait 1 second
-- Note that data is lua string, content is "12", corresponding to hex value [0x31,0x32]
-- lua string Not an array is not a table and cannot be read directly by subscript.
Print its hex string form
local hexStr, len = string.toHex(data) -- Return value "3132",2, followed by 2 is the length
print(hexStr) -- will be output 3132
--- Method 1, use pack.unpack
-- Decompose into 2 numbers, B is the number of unsigned bytes, and 2 represents the number
local nexti, numa, numb = pack.unpack(data, "b2")
print(numa) -- Numbers 31
print(numb) -- Numbers 32
Take the second number directly and write the position 2
local nexti, numb = pack.unpack(data,"b",2)
print(numb) -- Numbers 32
-- Method 2, use string.byte
local numa = string.byte(data, 1)
local numb = string.byte(data, 2)
print(numa) -- Numbers 31
print(numb) -- Numbers 32
Summary of methods#
string.byte Equivalent data[i-1]
string.char Equivalent data = {a, b, c, d}
pack.pack Data Packaging
pack.unpack Data unpacking
zbuff library, class C array operations