You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
7.5 KiB
251 lines
7.5 KiB
-- 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)
|
|
|