-- 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 if tonumber(size, 16) / 2 == 0 then values[address] = "" end 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 isNegative(str) -- 将字符串转换为数字 local num = tonumber(str) -- 如果转换成功,并且数字小于0,则返回true;否则返回false return num and num < 0 end function negativeToHex(n) -- 将负数转换为其补码形式 local complement = 0xFFFFFFFF + n + 1 -- 使用string.format将补码形式转换为十六进制字符串 local hexStr = string.format("%X", complement) hexStr = hexToLittleEndian(hexStr) -- 如果字符串长度大于4,则截取头4位(即高4位) if #hexStr > 4 then return string.sub(hexStr, 1, 4) else return hexStr end 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"] -- print("values",values) local keys = {} -- print("keys",keys) for key in pairs(values) do -- print("key",key) 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]))) -- print("value",values[key]) if isEmptyString(values[key]) then valueResult[startPoint] = values[key] valueSize[startPoint] = 2 else valueResult[startPoint] = hexToLittleEndian(string.format("%04X",values[key])) valueSize[startPoint] = 2 -- print(valueSize[startPoint]) end else -- print(decimalism) -- print(valueResult[startPoint]) if isEmptyString(values[key]) then -- print("result",valueResult[startPoint]) valueResult[startPoint] = valueResult[startPoint] -- valueResult[startPoint] = valueResult[startPoint] .. values[key] valueSize[startPoint] = valueSize[startPoint] + 2 else valueResult[startPoint] = valueResult[startPoint] .. hexToLittleEndian(string.format("%04X",values[key])) -- print(valueSize[startPoint]) valueSize[startPoint] = valueSize[startPoint] + 2 end 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 byteArray end function issueReadOrder(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"])) result = result .. string.format("%02X",luaTable["totalPairs"]) local values = luaTable["values"] -- print("values",values) local keys = {} -- print("keys",keys) for key in pairs(values) do result = result .. hexToLittleEndian(string.format("%04X",key)) .. hexToLittleEndian(string.format("%04X",values[key])) -- print("key",key) -- 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]))) -- print("value",values[key]) -- if isEmptyString(values[key]) then -- valueResult[startPoint] = values[key] -- valueSize[startPoint] = 2 -- else -- valueResult[startPoint] = hexToLittleEndian(string.format("%04X",values[key])) -- valueSize[startPoint] = 2 -- -- print(valueSize[startPoint]) -- end -- else -- -- print(decimalism) -- -- print(valueResult[startPoint]) -- if isEmptyString(values[key]) then -- print("result",valueResult[startPoint]) -- valueResult[startPoint] = valueResult[startPoint] -- -- valueResult[startPoint] = valueResult[startPoint] .. values[key] -- valueSize[startPoint] = valueSize[startPoint] + 2 -- else -- valueResult[startPoint] = valueResult[startPoint] .. hexToLittleEndian(string.format("%04X",values[key])) -- -- print(valueSize[startPoint]) -- valueSize[startPoint] = valueSize[startPoint] + 2 -- end -- 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 byteArray 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(values[key]) -- if isNegative(values[key]) then -- -- print("jade") -- -- print(string.format("%04X",values[key])) -- -- print(negativeToHex(values[key])) -- -- print(string.len((string.format("%04X",values[key])))) -- -- print(valueResult[startPoint]) -- -- string.sub(hexToLittleEndian(string.format("%04X",values[key])),1,4) -- valueResult[startPoint] = negativeToHex(values[key]) -- valueSize[startPoint]=2 -- else -- -- string.format("%04X",values[key]) -- valueResult[startPoint] = hexToLittleEndian(string.format("%04X",values[key])) -- valueSize[startPoint]=2 -- end -- -- valueResult[startPoint] = hexToLittleEndian(string.format("%04X",values[key])) -- -- valueSize[startPoint] = 2 -- -- print(valueSize[startPoint]) -- else -- -- print(decimalism) -- -- print(valueResult[startPoint]) -- if isNegative(values[key]) then -- -- print("jade") -- -- print(negativeToHex(values[key])) -- valueResult[startPoint] = valueResult[startPoint] .. negativeToHex(values[key]) -- valueSize[startPoint] = valueSize[startPoint] + 2 -- else -- -- string.format("%04X",values[key]) -- valueResult[startPoint] = valueResult[startPoint] .. hexToLittleEndian(string.format("%04X",values[key])) -- valueSize[startPoint] = valueSize[startPoint] + 2 -- end -- -- 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 -- return result -- -- 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 byteArray -- end -- parseRecord("0001A90AE4650000000001020002000100") -- local valuess = {} -- valuess["0002"] = "0001" -- print (valuess["0002"]) -- valuess = {[0002]="-10"} -- myTable = {type = "00", version = "01",time = 1709294663000,values = valuess} -- print(issueOrder(myTable)) -- print(hexToLittleEndian(string.format("%04X",-100))) -- print(string.sub(hexToLittleEndian(string.format("%04X",-100)),1,4)) -- 示例 -- 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 -- values = {} -- values[1] = "1" -- myTable = {type = "00", version = "01",values = values} -- print(issueOrder(myTable)) -- function -- issueOrder('{"version":"01","type":"00","time":"1709284976000","values":{"1":"1"}}') -- print("result","0001801a860f0000000004000006000100010001003275060032753375347518790600187919791a79007d0a00007d017d027d037d047d") -- 0001801a860f00000000043000010001000133000275327533753433100079187919791a5320007d007d017d027d037d04 -- 0001801a860f0000000004000006000100010001003275060032753375347518790600187919791a79007d0a00007d017d027d037d047d -- local result = parseRecord("000177EEE3650000000001020002000100") -- print(result)