-- local cjson = require("cjson") function parseRecord(t) local result = {} local start = 1 local type = hex_to_bytes(t, start, 1) --print("type:", type) start = start + 2 local version = hex_to_bytes(t, start, 1) --print("version:", version) start = start + 2 local time = hex_to_bytes(t, start, 8) --print("time:", time) start = start + 16 local pair = hex_to_bytes(t, start, 1) --print("pair:", pair) start = start + 2 local values = {} for i = 1, tonumber(pair, 16) do local address = hex_to_bytes(t, start, 2) -- print("startAdd:", address) start = start + 4 local size = hex_to_bytes(t, start, 2) --print("size:", size) start = start + 4 for j = 1, tonumber(size, 16) / 2 do --print(address, hex_to_bytes(t, start, 2)) values[address] = hex_to_bytes(t, start, 2) address = string.gsub(string.format("%#x", tonumber(address, 16) + 1), "0x", "") if string.len(address) < 4 then address = string.rep("0", 4 - string.len(address)) .. address end start = start + 4 end end result["type"] = type result["version"] = version result["time"] = tonumber(time, 16) result["pair"] = pair result["values"] = values -- print(result["type"], result["version"], result["time"], result["pair"]) for k,v in pairsByKeys(result["values"]) do -- print(k,v) end -- print(table2string(result)) return table2string(result) end function table2string(tablevalue) local stringtable = serialize(tablevalue) -- print(stringtable) return stringtable end function serialize(obj) local lua = "" local t = type(obj) if t == "number" then lua = lua .. obj elseif t == "boolean" then lua = lua .. tostring(obj) elseif t == "string" then lua = lua .. string.format("%q", obj) elseif t == "table" then lua = lua .. "{" for k, v in pairs(obj) do lua = lua .. serialize(k) .. ":" .. serialize(v) .. "," end local metatable = getmetatable(obj) if metatable ~= nil and type(metatable.__index) == "table" then for k, v in pairs(metatable.__index) do lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. "," end end lua = string.sub(lua, 1, -2) lua = lua .. "}" elseif t == "nil" then return nil else error("can not serialize a " .. t .. " type.") end return lua end function pairsByKeys(t) local a = {} for n in pairs(t) do a[#a + 1] = n end table.sort(a) local i = 0 local iter = function() i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end function length(t) local res=0 for k,v in pairs(t) do res=res+1 end return res end function hex_to_bytes(hex, start, len) -- print(hex) local value = hex:sub(start, start + len * 2 - 1) if len > 1 then value = toBigEndian(value) end return value end function toBigEndian(value) --print(string.len(value)) local hexResult = "" for i = string.len(value), 1, -2 do local hex = value:sub(i - 1, i) hexResult = hexResult .. hex end return hexResult end -- 将16进制字符串转换为小端格式 local function hexToLittleEndian(hexString) local littleEndian = "" for i = #hexString, 1, -2 do local byte = hexString:sub(i - 1, i) littleEndian = littleEndian .. byte end return littleEndian end function issueOrder(luaTable) -- print("start") -- print("luaTable",luaTable) local result = "" local timestamp = os.time() -- print("timestamp",timestamp) -- print("time",hexToLittleEndian(string.format("%016X",timestamp))) -- print("version",luaTable["version"]) -- print("type",luaTable["type"]) result = result .. luaTable["type"] .. luaTable["version"] .. hexToLittleEndian(string.format("%016X",timestamp)) -- print(type(luaTable["values"])) local values = luaTable["values"] local keys = {} for key in pairs(values) do table.insert(keys, key) end table.sort(keys) local lastDecimalism = -2 local totalPairs = 0 -- 打印排序后的键值对 local valueResult = {} local valueSize = {} local startPoint = -2 for _, key in ipairs(keys) do -- print(key, values[key]) -- print(key) local decimalism = key -- print(tonumber(decimalism) ~= lastDecimalism + 1) if tonumber(decimalism) ~= lastDecimalism + 1 then -- print("last + 1",lastDecimalism + 1) -- print("current",decimalism) -- print(decimalism) startPoint = decimalism totalPairs = totalPairs + 1 -- print(hexToLittleEndian(string.format("%04X",values[key]))) valueResult[startPoint] = hexToLittleEndian(string.format("%04X",values[key])) valueSize[startPoint] = 2 -- print(valueSize[startPoint]) else -- print(decimalism) -- print(valueResult[startPoint]) valueResult[startPoint] = valueResult[startPoint] .. hexToLittleEndian(string.format("%04X",values[key])) -- print(valueSize[startPoint]) valueSize[startPoint] = valueSize[startPoint] + 2 end lastDecimalism = decimalism end -- print(valueSize) result = result .. string.format("%02X",totalPairs) for ke,_ in pairsByKeys(valueSize) do -- print("jade") -- print(ke,vl) result = result .. hexToLittleEndian(string.format("%04X",ke)) .. hexToLittleEndian(string.format("%04X",valueSize[ke])) .. valueResult[ke] end local byteArray = {} -- for i = 1, #result, 2 do -- local hexByte = string.sub(result, i, i + 1) -- local decimalValue = tonumber(hexByte, 16) -- table.insert(byteArray, decimalValue) -- end -- for _, byte in ipairs(byteArray) do -- print(byte) -- end -- print("result",byteArray) return result end -- parseRecord("0001A90AE4650000000001020002000100") -- local valuess = {} -- valuess["0002"] = "0001" -- print (valuess["0002"]) -- valuess = {[0002]="0001"} -- myTable = {type = "00", version = "01",time = 1709294663000,values = valuess} -- issueOrder(myTable) -- 示例 -- local json_str = '{"name": "John", "age": 30, "city": "New York"}' -- local result_table = parse_json(json_str) -- -- 输出解析结果 -- for key, value in pairs(result_table) do -- print(key, value) -- end -- function -- issueOrder('{"version":"01","type":"00","time":"1709284976000","values":{"2":"1","31000":"31000","32003":"32003","31002":"31002","32002":"32002","30002":"30002","1":"1","30003":"30003","32000":"32000","32004":"32004","32001":"32001","0":"1","30004":"30004","31001":"31001"}}') -- print("result","0001801a860f0000000004000006000100010001003275060032753375347518790600187919791a79007d0a00007d017d027d037d047d") -- 0001801a860f00000000043000010001000133000275327533753433100079187919791a5320007d007d017d027d037d04 -- 0001801a860f0000000004000006000100010001003275060032753375347518790600187919791a79007d0a00007d017d027d037d047d -- local result = parseRecord("000177EEE3650000000001020002000100") -- print(result)