api.lua 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. local ASCII_CR = 0x0D
  2. local ASCII_LF = 0x0A
  3. local ASCII_0 = 48
  4. local ASCII_9 = 57
  5. local ASCII_A = 65
  6. local ASCII_F = 70
  7. local ASCII_Z = 90
  8. local ASCII_a = 97
  9. local ASCII_f = 102
  10. local ASCII_z = 122
  11. local moduleName = "api"
  12. local logSwitch = false
  13. local function logF(...)
  14. if logSwitch then
  15. log.info(moduleName, ...)
  16. end
  17. end
  18. local api = {}
  19. -- 数组型TABLE转成BIN
  20. function api.ArrayToBin(Array, Len)
  21. logF("ArrayToBin")
  22. if Len == nil or Len > #Array then
  23. Len = #Array
  24. end
  25. return string.char(unpack(Array, 1, Len))
  26. end
  27. -- 检查输入的数据是否为全数字字符串,如果是table,则自动转为string
  28. function api.DigitalStrCheck(Data, Len)
  29. logF("DigitalStrCheck")
  30. if type(Data) == "table" then
  31. Data = ArrayToBin(Data)
  32. elseif type(Data) ~= "string" then
  33. return false
  34. end
  35. if Len == nil or Len > string.len(Data) then
  36. Len = string.len(Data)
  37. end
  38. if Len == 0 then
  39. return false
  40. end
  41. for i = 1, Len do
  42. local Temp = string.byte(Data, i)
  43. if Temp >= ASCII_0 and Temp <= ASCII_9 then
  44. else
  45. return false
  46. end
  47. end
  48. return true
  49. end
  50. -- 检查输入的数据是否为全数字字母字符串,如果是table,则自动转为string
  51. function api.HexStrCheck(Data, Len)
  52. logF("HexStrCheck")
  53. if type(Data) == "table" then
  54. Data = ArrayToBin(Data)
  55. elseif type(Data) ~= "string" then
  56. return false
  57. end
  58. if Len == nil or Len > string.len(Data) then
  59. Len = string.len(Data)
  60. end
  61. for i = 1, Len do
  62. local Temp = string.byte(Data, i)
  63. if (Temp >= ASCII_0 and Temp <= ASCII_9) or (Temp >= ASCII_a and Temp <= ASCII_f) or (Temp >= ASCII_A and Temp <= ASCII_F) then
  64. else
  65. return false
  66. end
  67. end
  68. return true
  69. end
  70. -- 字节流数据转换为可打印字符串,用Cut来分隔开{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
  71. function api.BinToHex(Data, Len, Cut)
  72. logF("BinToHex")
  73. local Hex = {}
  74. if type(Data) == "table" then
  75. Data = ArrayToBin(Data)
  76. elseif type(Data) ~= "string" then
  77. return nil
  78. end
  79. if type(Len) == "string" then
  80. Cut = Len
  81. Len = string.len(Data)
  82. elseif type(Len) == "number" then
  83. if Len > string.len(Data) then
  84. Len = string.len(Data)
  85. end
  86. else
  87. Len = string.len(Data)
  88. end
  89. for i = 1, Len do
  90. table.insert(Hex, string.upper(string.format("%02x", string.byte(Data, i))) .. (Cut == nil and "" or Cut))
  91. end
  92. return table.concat(Hex)
  93. end
  94. function api.BinToDec(Data, Len, Cut)
  95. logF("BinToDec")
  96. local Hex = {}
  97. if type(Data) == "table" then
  98. Data = ArrayToBin(Data)
  99. elseif type(Data) ~= "string" then
  100. return nil
  101. end
  102. if type(Len) == "string" then
  103. Cut = Len
  104. Len = string.len(Data)
  105. elseif type(Len) == "number" then
  106. if Len > string.len(Data) then
  107. Len = string.len(Data)
  108. end
  109. else
  110. Len = string.len(Data)
  111. end
  112. for i = 1, Len do
  113. table.insert(Hex, string.upper(string.format("%d", string.byte(Data, i))) .. (Cut == nil and "" or Cut))
  114. end
  115. return table.concat(Hex)
  116. end
  117. -- 可打印字符串转换为字节流数据,"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
  118. function api.StrToBin(Str, Len)
  119. logF("StrToBin")
  120. if type(Str) == "table" then
  121. Str = api.ArrayToBin(Str)
  122. elseif type(Str) ~= "string" then
  123. return nil
  124. end
  125. if #Str % 2 > 0 then
  126. Str = "0" .. Str
  127. end
  128. if Len == nil or (Len * 2) > #Str then
  129. Len = #Str / 2
  130. end
  131. local Buf = {}
  132. local Temp
  133. for var = 1, Len do
  134. Temp = string.sub(Str, var * 2 - 1, var * 2)
  135. Temp = tonumber(Temp, 16)
  136. table.insert(Buf, Temp)
  137. end
  138. return api.ArrayToBin(Buf, Len)
  139. end
  140. -- 表数据数据用10进制,Cut做分割,默认用空格
  141. function api.TableToDecStr(Table, Len, Cut)
  142. logF("TableToDecStr")
  143. local Hex = {}
  144. if type(Table) == "table" then
  145. if type(Len) == "string" then
  146. Cut = Len
  147. Len = #Table
  148. elseif type(Len) == "number" then
  149. if Len > #Table then
  150. Len = #Table
  151. end
  152. else
  153. Len = #Table
  154. end
  155. for i = 1, Len do
  156. table.insert(Hex, string.format("%d", Table[i]) .. (Cut == nil and " " or Cut))
  157. end
  158. return table.concat(Hex)
  159. else
  160. return nil
  161. end
  162. end
  163. -- 数字(默认base16)转BIN,小端格式0x12345678 -> 0x78 0x56 0x34 0x12
  164. function api.NumToLitteBin(Num, Len, Base)
  165. logF("NumToLitteBin")
  166. local Buf = {}
  167. local NumTemp
  168. if Len == nil then
  169. Len = 4
  170. end
  171. if Base ~= 10 then
  172. Base = 256
  173. else
  174. Base = 100
  175. end
  176. if Num == nil then
  177. Num = 0
  178. end
  179. for var = 1, Len do
  180. NumTemp = Num % Base
  181. table.insert(Buf, NumTemp)
  182. Num = Num / Base
  183. end
  184. return api.ArrayToBin(Buf, Len)
  185. end
  186. -- BIN转Num,小端格式0x78 0x56 0x34 0x12 -> 0x12345678
  187. function api.LitteBinToNum(Bin, Len)
  188. logF("LitteBinToNum")
  189. local Num = 0
  190. if Len == nil then
  191. Len = 4
  192. end
  193. for i = Len, 1, -1 do
  194. if string.byte(Bin, i) ~= nil then
  195. Num = Num * 256
  196. Num = Num + string.byte(Bin, i)
  197. end
  198. end
  199. return Num
  200. end
  201. -- 数字(默认base16)转BIN,大端格式0x12345678 -> 0x12 0x34 0x56 0x78
  202. function api.NumToBigBin(Num, Len, Base)
  203. logF("NumToBigBin")
  204. local Buf = {}
  205. local NumTemp
  206. if Len == nil then
  207. Len = 4
  208. end
  209. if Base ~= 10 then
  210. Base = 256
  211. else
  212. Base = 100
  213. end
  214. if Num == nil then
  215. Num = 0
  216. end
  217. for var = 1, Len do
  218. NumTemp = Num % Base
  219. table.insert(Buf, 1, NumTemp)
  220. Num = Num // Base
  221. end
  222. return api.ArrayToBin(Buf, Len)
  223. end
  224. -- BIN转Num,大端格式0x12 0x34 0x56 0x78 -> 0x12345678
  225. function api.BigBinToNum(Bin, Len)
  226. logF("BigBinToNum")
  227. local Num = 0
  228. if Len == nil then
  229. Len = 4
  230. end
  231. for i = 1, Len do
  232. if string.byte(Bin, i) ~= nil then
  233. Num = Num * 256
  234. Num = Num + string.byte(Bin, i)
  235. end
  236. end
  237. return Num
  238. end
  239. -- 数字(默认base10)转BCD
  240. function api.NumToBCDBin(Num, Len, Base)
  241. logF("NumToBCDBin")
  242. local Buf = {}
  243. local NumTemp
  244. if Base ~= 16 then
  245. Base = 100
  246. else
  247. Base = 256
  248. end
  249. for var = 1, Len do
  250. NumTemp = Num % Base
  251. NumTemp = (NumTemp // 10 * 16) + (NumTemp % 10)
  252. table.insert(Buf, 1, NumTemp)
  253. Num = Num // Base
  254. end
  255. return api.ArrayToBin(Buf, Len)
  256. end
  257. function api.FloatToNum(inStr, decimalNum)
  258. logF("FloatToNum")
  259. if type(inStr) ~= "string" then
  260. return nil
  261. end
  262. local integer, fraction = string.match(inStr, "(%d+)%.(%d+)")
  263. if fraction == nil then
  264. fraction = ""
  265. end
  266. if integer == nil then
  267. integer = "0"
  268. end
  269. fraction = fraction .. string.rep("0", decimalNum)
  270. fraction = string.sub(fraction, 1, decimalNum)
  271. return tonumber(integer .. fraction)
  272. end
  273. function api.NumToFloat(Num, integerNum, decimalNum)
  274. return string.sub(str, 1, integerNum) .. "." .. string.sub(str, integerNum + 1, integerNum + decimalNum)
  275. end
  276. -- 异或校验
  277. function api.XorCheck(Data, Len, Start)
  278. logF("XorCheck")
  279. if type(Data) == "table" then
  280. Data = api.ArrayToBin(Data)
  281. elseif type(Data) ~= "string" then
  282. return nil
  283. end
  284. if type(Len) == "string" then
  285. Start = Len
  286. Len = #Data
  287. elseif type(Len) == "number" then
  288. if Len > #Data then
  289. Len = #Data
  290. end
  291. else
  292. Len = #Data
  293. end
  294. local Check = (Start == nil and 0 or Start)
  295. for i = 1, Len do
  296. Check = bit.bxor(Check, string.byte(Data, i))
  297. end
  298. return Check
  299. end
  300. -- 开平方
  301. function api.Sqrt(a)
  302. logF("Sqrt")
  303. local x
  304. if a == 0 or a == 1 then
  305. return a
  306. end -- 特殊处理直接返回
  307. x = a / 2
  308. for i = 1, 100 do
  309. x = (x + a / x) / 2
  310. end
  311. return x
  312. end
  313. -- 返回差值的绝对值
  314. function api.Minus(v1, v2)
  315. logF("Minus")
  316. return ((v1 > v2) and (v1 - v2) or (v2 - v1))
  317. end
  318. -- 非精确计算GPS坐标差值,输入NTU型数据,西经和南纬为负
  319. function api.GPSDiff(NTULat1, NTULat2, NTULon1, NTULon2)
  320. logF("GPSDiff")
  321. if NTULat1 == nil or NTULat2 == nil or NTULon1 == nil or NTULon2 == nil then
  322. return 0
  323. end
  324. local D1 = api.Minus(NTULat1, NTULat2)
  325. local D2 = api.Minus(NTULon1, NTULon2)
  326. return (D1 * D1 + D2 * D2)
  327. end
  328. return api