详解lua的string与hex数据(十六进制)

本文希望阐述的问题

在lua中处理 string 与 hex(十六进制数) 的思维转换

背景

luat在处理通信的时候,总会设计到数据处理,例如:

socket:sendsocket:recvspi.sendspi.recvuart.write

这些方法要么发送的string,要么返回string, 而不是使用其他编程语言的byte[]/char[], 因为lua没有byte和char

什么是hex

先看hex的表现形式

字符串"1" 的 ASCII码是 0x31字符串"2" 的 ASCII码是 0x320x3132         -- 数值标识"3132"         -- hex字符串,这个给人看的HEX字符串"12"           -- 与0x3132等价一个lua string{0x31, 0x32}   -- lua数组(table)[0x31, 0x32]   -- java/c/c++的byte[]/char[]

数据转换

把0x3132写入uart, socket/spi都是同理

// 方法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均同理

local re, data = socket:recv(1000) -- 等待1秒-- 注意, data是lua string, 内容是 "12", 对应hex值 [0x31,0x32]-- lua string不是数组不是table,不能直接下标读取打印其hex字符串形式local hexStr, len = string.toHex(data) -- 返回值"3132",2,后面的2是长度print(hexStr) -- 将输出 3132--- 方式1,使用pack.unpack-- 分解为2个数, b是无符号单字节数,2代表数量local nexti, numa, numb = pack.unpack(data, "b2")print(numa) -- 数字 31print(numb) -- 数字 32直接取第二个数, 位置写2local nexti, numb = pack.unpack(data,"b",2)print(numb) -- 数字 32-- 方式2,使用string.bytelocal numa = string.byte(data, 1)local numb = string.byte(data, 2)print(numa) -- 数字 31print(numb) -- 数字 32

扩展链接

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

(0)

相关推荐