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.
486 lines
16 KiB
486 lines
16 KiB
2 months ago
|
-- 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)
|