lua 二进制和八进制字符串互转

 local h2b = {
    ["0"] = 0,
    ["1"] = 1,
    ["2"] = 2,
    ["3"] = 3,
    ["4"] = 4,
    ["5"] = 5,
    ["6"] = 6,
    ["7"] = 7,
    ["8"] = 8,
    ["9"] = 9,
    ["A"] = 10,
    ["B"] = 11,
    ["C"] = 12,
    ["D"] = 13,
    ["E"] = 14,
    ["F"] = 15
}
local function hexstr2bin( hexstr )
    local s = string.gsub(hexstr, "(.)(.)", function ( h, l )
         return string.char(h2b[h]*16+h2b[l])
    end)
    return s
end

local function bin2hexstr(s)
    s=string.gsub(s,"(.)",function (x) return string.format("%02X",string.byte(x)) end)
    return s
end

hexStr = "67879AAF65F3332A3B5E"

print("hexStr:"..hexStr.."\n")

local binVal = hexstr2bin(hexStr)
print(binVal);

print("hexStr:"..bin2hexstr(binVal))

上面所用的lua模元字符串含义可以对照下表


模式元字符 描述
. 所有字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点符号
%s 空白字符
%u 大写字母
%w 字母和数字字符
%x 十六进制数字
%z 内部表示为0的字符


再结合一些例子比较好理解

1.这里括弧就是匹配到的数据需要返回的

pair = "name = Anna"
 key,value = string.match(pair,"(%a+)%s*=%s*(%a+)")
 print(key,value)  --输出name anna
 
 date = "Today is 2012-01-02"
 y,m,d = string.match(date,"(%d+)\-(%d+)\-(%d+)")
 print(y,m,d)      --输出2012    01      02

2.还可以对模式本身使用捕获。即%1表示第一个捕获,以此类推,%0表示整个匹配,如:

print(string.gsub("hello Lua","(.)(.)","%2%1"))  --将相邻的两个字符对调,输出为ehll ouLa
print(string.gsub("hello Lua!","%a","%0-%0"))    --输出为h-he-el-ll-lo-o L-Lu-ua-a!


3.当然也可以是函数,就像最开始代码用到的

含义就是两个任意字母依次遍历,好像这个“.”匹配的时候可以是不可见字符,否则文章中的代码就有问题了

local function hexstr2bin( hexstr )
    local s = string.gsub(hexstr, "(.)(.)", function ( h, l )
         return string.char(h2b[h]*16+h2b[l])
    end)
    return s
end

这个反正不同函数用的模式匹配规则都一样的,lua真的功能很强大


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值