FormatString
简介
比特( bit)是二进制单位( binary unit)或二进制数字(binary digit)的缩写,pack 库支持将一系列数据按照格式字符转化为 lua 字符串或者将 lua 字符串按照格式字符转化成一系列值,utf8、 ucs2、 gb2312编码是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求:以上都是常见的数据格式。需要进行运算、转换等格式化处理。见指南
材料准备
- EVB_Air724UG_A13开发板一套,包括USB线。
- luat开发环境:环境搭建方法
步骤
本文以demo/formatString为例做演示。
示例代码和库下载
运行后日志打印如下:
[2021-04-20 14:01:57.761] bittest:
[2021-04-20 14:01:57.761] 4
[2021-04-20 14:01:57.761] true
[2021-04-20 14:01:57.761] false
[2021-04-20 14:01:57.761] true
[2021-04-20 14:01:57.761] false
[2021-04-20 14:01:57.761] false
[2021-04-20 14:01:57.761] true
[2021-04-20 14:01:57.761] false
[2021-04-20 14:01:57.761] true
[2021-04-20 14:01:57.761] 15
[2021-04-20 14:01:57.761] 0
[2021-04-20 14:01:57.761] 4294967290
[2021-04-20 14:01:57.761] 1
[2021-04-20 14:01:57.761] 3
[2021-04-20 14:01:57.761] 3
[2021-04-20 14:01:57.761] 4
[2021-04-20 14:01:57.761] 1
[2021-04-20 14:01:57.761] 0
[2021-04-20 14:01:57.761] pcak.pack test:
[2021-04-20 14:01:57.761] 3234 2
[2021-04-20 14:01:57.761] 3432 2
[2021-04-20 14:01:57.761] 4C55415400640A 7
[2021-04-20 14:01:57.761] pack.unpack test:
[2021-04-20 14:01:57.761] 4 999 10
[2021-04-20 14:01:57.761] stringtest:
[2021-04-20 14:01:57.761] abc
[2021-04-20 14:01:57.761] 97 2
[2021-04-20 14:01:57.761] string.format
[2021-04-20 14:01:57.761] 0100//luat100great
[2021-04-20 14:01:57.761] string.gsub
[2021-04-20 14:01:57.761] luat great 1
[2021-04-20 14:01:57.761] string.find
[2021-04-20 14:01:57.761] 8 12
[2021-04-20 14:01:57.761] string.match
[2021-04-20 14:01:57.761] 100
[2021-04-20 14:01:57.761] string.sub
[2021-04-20 14:01:57.761] luat
[2021-04-20 14:01:57.761] 6162 2
[2021-04-20 14:01:57.761] 12 2
[2021-04-20 14:01:57.761] ucs2ToGb2312
[2021-04-20 14:01:57.761] gb2312 code:
[2021-04-20 14:01:57.761] gb2312ToUcs2
[2021-04-20 14:01:57.761] unicode little-endian code:1162
[2021-04-20 14:01:57.761] ucs2beToGb2312
[2021-04-20 14:01:57.761] gd2312 code :
[2021-04-20 14:01:57.761] gb2312ToUcs2be
[2021-04-20 14:01:57.761] unicode big-endian code :6211
[2021-04-20 14:01:57.761] ucs2ToUtf8
[2021-04-20 14:01:57.761] utf8 code:E68891
[2021-04-20 14:01:57.761] utf8ToGb2312
[2021-04-20 14:01:57.761] gd2312 code:
分析调试:
- 1、[2021-04-20 14:01:57.761] 97 2
这个打印的是“97 2”,为什么不是上面的第二个“98 2”,因为string.byte(“abc”)的第二个参数没有,默认输出第一个字符。 - 2、[2021-04-20 14:01:57.761] 8 12
print(“string.find\r\n”,string.find(string1,“great”)),字符从左到右计数是从1开始,不是从0开始,所以是8,不是7。 - 3、字符串中可以有‘NULL’等不可见字符,如下:
str=string.char(0x2b,0x35,0x00,0x45)
print(type(str)…#str)
print(str)
运行结果为:
string4
+5E(5和E之间有个框) - 4、如何unpack有符号数
代码修改如下两行就可以unpack出-100。
local stringtest = pack.pack(">AHb",“luat”,0xff9c,10)
nextpox1,val1,val2 = pack.unpack(string.sub(stringtest,5,-1),">hb")
[2021-04-21 11:55:29.649] pack.unpack test:
[2021-04-21 11:55:29.649] 4 -100 10 - 5、为什么汉字显示为空?
因为luatool只显示utf8编码汉字,在对应的地方加上":toHex()"显示,utf8直接打印:print(“utf8 code:我”…utf8num…string.toHex(utf8num)) 。修改后的打印如下:[2021-04-20 15:01:44.323] ucs2ToGb2312
[2021-04-20 15:01:44.323] gb2312 code: CED2 2
[2021-04-20 15:01:44.323] gb2312ToUcs2
[2021-04-20 15:01:44.323] unicode little-endian code:1162
[2021-04-20 15:01:44.323] ucs2beToGb2312
[2021-04-20 15:01:44.323] gd2312 code :CED2
[2021-04-20 15:01:44.323] gb2312ToUcs2be
[2021-04-20 15:01:44.323] unicode big-endian code :6211
[2021-04-20 15:01:44.323] ucs2ToUtf8
[2021-04-20 15:01:44.323] utf8 code:我我E68891
[2021-04-20 15:01:44.323] utf8ToGb2312
[2021-04-20 15:01:44.323] gd2312 code:CED2
常见问题
1、字符串打印为空。原因是字符串里有不可见字符比如“空字符(Null)”,解决方式toHex()后打印。