zoukankan      html  css  js  c++  java
  • Lua 进制转换总结

    刚好遇到一些数据上的转换,思考一番相关实现,总结一下作为笔记记录下来。
    希望对你也有帮助。

    16进制字符串为10进制

    > print(tonumber("12345678", 16))
    305419896
    

    十进制转二进制

    function dec2bin(n)
        local t = {}
          for i=31,0,-1 do
            t[#t+1] = math.floor(n / 2^i)
            n = n % 2^i
          end
          return table.concat(t)
        end
    

    实现常规转换的所有功能

    参考Lua 中 number 转换各种进制,以及string串转number

    
    -- Bin 2
    -- Oct 8
    -- Dec 10
    -- Hex 16
    
    local _convertTable = {
        [0] = "0",
        [1] = "1",
        [2] = "2",
        [3] = "3",
        [4] = "4",
        [5] = "5",
        [6] = "6",
        [7] = "7",
        [8] = "8",
        [9] = "9",
        [10] = "A",
        [11] = "B",
        [12] = "C",
        [13] = "D",
        [14] = "E",
        [15] = "F",
        [16] = "G",
    }
    
    local function GetNumFromChar(char)
        for k, v in pairs(_convertTable) do
            if v == char then
                return k
            end
        end
        return 0
    end
    
    local function Convert(dec, x)
    
        local function fn(num, t)
            if(num < x) then
                table.insert(t, num)
            else
                fn( math.floor(num/x), t)
                table.insert(t, num%x)
            end
        end
        
        local x_t = {}
        fn(dec, x_t, x)
    
        return x_t
    end
    
    function ConvertDec2X(dec, x)
        local x_t = Convert(dec, x)
    
        local text = ""
        for k, v in ipairs(x_t) do
            text = text.._convertTable[v]
        end
        return text
    end
    
    function ConvertStr2Dec(text, x)
        local x_t = {}
        local len = string.len(text)
        local index = len
        while ( index > 0) do
            local char = string.sub(text, index, index)
            x_t[#x_t + 1] = GetNumFromChar(char)
            index = index - 1
        end
    
        local num = 0
        for k, v in ipairs(x_t) do
            num = num + v * math.pow(x, k - 1) 
        end
        return num
    end
    
    --Test
    local num = 10086
    
    print("---- dec convert to x ----
    ")
    local text1 = ConvertDec2X(num, 10)
    local text2 = ConvertDec2X(num, 2)
    local text3 = ConvertDec2X(num, 8)
    local text4 = ConvertDec2X(num, 16)
    local text5 = ConvertDec2X(num, 14)
    print(string.format("dec %d to dec %s", num, text1))
    print(string.format("dec %d to bin %s", num, text2))
    print(string.format("dec %d to Oct %s", num, text3))
    print(string.format("dec %d to Hex %s", num, text4))
    print(string.format("dec %d to 14  %s", num, text5))
    
    
    print("
    ---- string to num ----
    ")
    local num1 = ConvertStr2Dec(text1, 10)
    local num2 = ConvertStr2Dec(text2, 2)
    local num3 = ConvertStr2Dec(text3, 8)
    local num4 = ConvertStr2Dec(text4, 16)
    local num5 = ConvertStr2Dec(text5, 14)
    print(string.format("dec:%s to dec %d", text1, num1))
    print(string.format("bin:%s to dec %d", text2, num2))
    print(string.format("Oct:%s to dec %d", text3, num3))
    print(string.format("Hex:%s to dec %d", text4, num4))
    print(string.format("14:%s to dec %d", text5, num5))  
    
    ---- dec convert to x ----
    
    dec 10086 to dec 10086
    dec 10086 to bin 10011101100110
    dec 10086 to Oct 23546
    dec 10086 to Hex 2766
    dec 10086 to 14  3966
    
    ---- string to num ----
    
    dec:10086 to dec 10086
    bin:10011101100110 to dec 10086
    Oct:23546 to dec 10086
    Hex:2766 to dec 10086
    14:3966 to dec 10086
    
    
    Knowledge, like candlelight, can illuminate a person and countless people.
  • 相关阅读:
    运营设计方法论
    使用 typescript ,提升 vue 项目的开发体验(2)
    PAT 1078. 字符串压缩与解压
    PAT 1077. 互评成绩计算
    PAT 1076. Wifi密码
    PAT 1075. 链表元素分类
    PAT 1074. 宇宙无敌加法器
    PAT 1073. 多选题常见计分法
    PAT 1072. 开学寄语
    PAT 1071. 小赌怡情
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/14758888.html
Copyright © 2011-2022 走看看