进制转换

简介: 进制转换

场景与需求

由于我们的 Lua 一般使用在嵌入式场景,很多时候会遇到十六进制二进制的数据处理。虽然 Lua 自带的字符串功能十分强大,但是处理十六进制的时候还是需要我们做一些工作的,本笔记记录下来这些常用的处理方法。


普通字符串十六进制显示

--- 字符串转为十六进制显示
--- @param str string 原始字符串
--- @param separator string | nil 分隔符
--- @return string 十六进制显示字符串
function string.toHex(str, separator)
    if (type(str) ~= "string") then error("string.toHex invalid params type") end
    local buffer = {}
    for index = 1, str:len() do
        table.insert(buffer, string.format("%02X", str:sub(index):byte()))
    end
    return table.concat(buffer, separator or "")
end点击复制复制失败已复制


用法:

local str = "123f你好ds"
print(string.toHex("hello world"))  --> 68656C6C6F20776F726C64
print(string.toHex("str"))          --> 737472
print(string.toHex("str", ' '))     --> 73 74 72
print(str:toHex())                  --> 31323366E4BDA0E5A5BD6473
print(str:toHex('-'))               --> 31-32-33-66-E4-BD-A0-E5-A5-BD-64-73点击复制复制失败已复制


十六进制字符串转标准字符串

提示

Lua 中,由于默认就是 UTF-8 格式的编码,因此这里省去了我们好多麻烦。

--- 十六进制显示字符串转标准字符串
--- @param hex string 十六进制显示的字符串
--- @return string 标准字符串
function string.fromHex(hex)
    if (type(hex) ~= "string") then error("string.fromHex invalid params type") end
    -- 滤掉分隔符
    hex = hex:gsub("[%s%p]", ""):upper()
    -- 检查内容是否合法
    if (hex:find("[^0-9A-Fa-f]") ~= nil) then error("string.fromHex invalid params content") end
    -- 检查字符串长度
    if (hex:len() % 2 ~= 0) then error("string.fromHex invalid params length") end
    -- 拼接字符串
    local buffer = {}
    for index = 1, hex:len(), 2 do
        table.insert(buffer, string.char(tonumber(hex:sub(index, index + 1), 16)))
    end
    return table.concat(buffer)
end点击复制复制失败已复制


用法:

local str = "123f你好ds"
print(string.fromHex("31:32"))        --> 12
print(string.fromHex(str.toHex()))    --> 123f你好ds
print(string.fromHex(str.toHex("-"))) --> 123f你好ds
目录
相关文章
|
5月前
二进制和进制转换
二进制和进制转换
67 0
|
3月前
|
存储
八进制转换为十进制
【7月更文挑战第6天】八进制转换为十进制。
83 2
|
4月前
|
存储
详细讲解,进制转换
详细讲解,进制转换
|
5月前
|
C语言
进制转换间的那点事
进制转换间的那点事
|
5月前
|
存储
【二进制转换】十进制 转 二进制 (含相关题型)
【二进制转换】十进制 转 二进制 (含相关题型)
55 0
|
小程序
ABCDEFG(进制转换::小转大)
ABCDEFG(进制转换::小转大)
81 0
十进制转换为2进制
十进制转换为2进制
93 0
十进制转换为2进制