Toggle navigation
首页
(current)
问答
文章
话题
商城
登录
注册
详解lua的string与hex数据(十六进制)
string
hex
用例子的方式解析lua中string与hex的转换
# 本文希望阐述的问题 在lua中处理 string 与 hex(十六进制数) 的思维转换 ## 背景 luat在处理通信的时候,总会设计到数据处理,例如: ``` socket:send socket:recv spi.send spi.recv uart.write ``` 这些方法要么发送的string,要么返回string, 而不是使用其他编程语言的byte[]/char[], 因为lua没有byte和char ## 什么是hex 先看hex的表现形式 ``` 字符串"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, 使用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) -- 数字 31 print(numb) -- 数字 32 直接取第二个数, 位置写2 local nexti, numb = pack.unpack(data,"b",2) print(numb) -- 数字 32 -- 方式2,使用string.byte local numa = string.byte(data, 1) local numb = string.byte(data, 2) print(numa) -- 数字 31 print(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
发表于 2019-05-15 11:34
阅读 ( 13599 )
分类:
默认分类
6 推荐
打赏
收藏
你可能感兴趣的文章
相关问题
Air302尝试使用字符串格式控制函数输出格式化字符串内容错误
0 回答
设备发送IMEI,然后要转hex,该怎么做?
1 回答
设备发送IMEI,然后要转hex,该怎么做?
1 回答
0 条评论
请先
登录
后评论
技术销售Wendal
软件工程师
15 篇文章
作家榜
»
技术销售Delectate
43 文章
陈夏
26 文章
国梁
24 文章
miuser
21 文章
晨旭
20 文章
朱天华
19 文章
金艺
19 文章
杨奉武
18 文章
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!