本文希望阐述的问题
在lua中处理 string 与 hex(十六进制数) 的思维转换
背景
luat在处理通信的时候,总会设计到数据处理,例如:
1 2 3 4 5
| socket:send socket:recv spi.send spi.recv uart.write
|
这些方法要么发送的string,要么返回string, 而不是使用其他编程语言的byte[]/char[], 因为lua没有byte和char
什么是hex
先看hex的表现形式
1 2 3 4 5 6 7 8
| 字符串"1" 的 ASCII码是 0x31 字符串"2" 的 ASCII码是 0x32
0x3132 -- 数值标识 "3132" -- hex字符串,这个给人看的HEX字符串 "12" -- 与0x3132等价一个lua string {0x31, 0x32} -- lua数组(table) [0x31, 0x32] -- java/c/c++的byte[]/char[]
|
数据转换
把0x3132写入uart, socket/spi都是同理
1 2 3 4 5 6 7 8 9 10 11
| // 方法1, 使用string.char, 逐个字节描述 local data = string.char(0x31, 0x32) uart.write(id, data)
// 方法2, 使用 string.fromHex, 传入2的倍数长度的hex字符串 local data = string.fromHex("3132") uart.write(id, data)
// 方法3, 使用pack库, H代表2字节符号数, I代表4字节无符号数, wiki可查 local data = pack.pack("H", 0x3132) uart.write(id, data)
|
将socket读取的数据转换为数值, uart/spi均同理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| local re, data = socket:recv(1000)
打印其hex字符串形式 local hexStr, len = string.toHex(data) print(hexStr)
local nexti, numa, numb = pack.unpack(data, "b2") print(numa) print(numb) 直接取第二个数, 位置写2 local nexti, numb = pack.unpack(data,"b",2) print(numb)
local numa = string.byte(data, 1) local numb = string.byte(data, 2) print(numa) print(numb)
|
扩展链接
string.byte用法
http://wiki.openluat.com/doc/luatApi/#stringbyte
string.fromHex用法
http://wiki.openluat.com/doc/luatApi/#stringfromhex
string.toHex用法
http://wiki.openluat.com/doc/luatApi/#stringtohex
pack库
http://wiki.openluat.com/doc/luatApi/#packpack