erlang自定义二进制协议
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

283 рядки
7.6 KiB

1 рік тому
1 рік тому
  1. function ByteArray()
  2. local mBuf = {} -- 二进制字节流
  3. local mPos = 1 -- 读写位置
  4. local ba = {}
  5. -- 设置字节流 解码先设置从tcp获取得来的字节数据 或者编码之前先重置 mBuf 和 mPos
  6. ba.setBytes = function(buf)
  7. mBuf = buf
  8. mPos = 1 -- 这里必须重置读写位置为1,方能保证接下去的读操作正确
  9. end
  10. -- 获取字节流 编码完成之后 通过该接口获取编码之后的字节数据
  11. ba.getBytes = function()
  12. return table.concat(mBuf)
  13. end
  14. -- 字节流转为字符串,radix-8,10,16
  15. ba.toString = function(buff, radix, separator)
  16. radix = radix or 16
  17. if radix == 8 then
  18. radix = "%03o"
  19. elseif radix == 16 then
  20. radix = "%02X"
  21. else
  22. radix = "%03u"
  23. end
  24. separator = separator or " "
  25. local bytes = {}
  26. for i = 1, buff do
  27. bytes[i] = string.format(radix .. separator, string.byte(buff[i]))
  28. end
  29. return table.concat(bytes)
  30. end
  31. -- 读布尔型
  32. ba.read_bool = function()
  33. return 1 == read_int8()
  34. end
  35. -- 写布尔型
  36. ba.write_bool = function(value)
  37. if value then
  38. ba.write_int8(1)
  39. else
  40. ba.write_int8(0)
  41. end
  42. end
  43. -- 读字符型
  44. ba.read_int8 = function()
  45. local value, tPos = string.unpack(">i1", mBuf, mPos)
  46. mPos = tPos
  47. return value
  48. end
  49. -- 写字符型
  50. ba.write_int8 = function(value)
  51. local value = string.pack(">i1", value)
  52. mBuf[mPos] = value
  53. mPos = mPos + 1
  54. end
  55. -- 读单字节
  56. ba.read_uint8 = function()
  57. local value, tPos = string.unpack(">I1", mBuf, mPos)
  58. mPos = tPos
  59. return value
  60. end
  61. -- 写单字节
  62. ba.write_uint8 = function(value)
  63. local value = string.pack(">I1", value)
  64. mBuf[mPos] = value
  65. mPos = mPos + 1
  66. end
  67. -- 读16位整型
  68. ba.read_int16 = function()
  69. local value, tPos = string.unpack(">i2", mBuf, mPos)
  70. mPos = tPos
  71. return value
  72. end
  73. -- 写16位整型
  74. ba.write_int16 = function(value)
  75. local value = string.pack(">i2", value)
  76. mBuf[mPos] = value
  77. mPos = mPos + 1
  78. end
  79. -- 读16位无符号整型
  80. ba.read_uint16 = function()
  81. local value, tPos = string.unpack(">I2", mBuf, mPos)
  82. mPos = tPos
  83. return value
  84. end
  85. -- 写16位无符号整型
  86. ba.write_uint16 = function(value)
  87. local value = string.pack(">I2", value)
  88. mBuf[mPos] = value
  89. mPos = mPos + 1
  90. end
  91. -- 读32位整型
  92. ba.read_int32 = function()
  93. local value, tPos = string.unpack(">i4", mBuf, mPos)
  94. mPos = tPos
  95. return value
  96. end
  97. -- 写32位整型
  98. ba.write_int32 = function(value)
  99. local value = string.pack(">i4", value)
  100. mBuf[mPos] = value
  101. mPos = mPos + 1
  102. end
  103. -- 读32位无符号整型
  104. ba.read_uint32 = function()
  105. local value, tPos = string.unpack(">I4", mBuf, mPos)
  106. mPos = tPos
  107. return value
  108. end
  109. -- 写32位无符号整型
  110. ba.write_uint32 = function(value)
  111. local value = string.pack(">I4", value)
  112. mBuf[mPos] = value
  113. mPos = mPos + 1
  114. end
  115. -- 读64位符号整型
  116. ba.read_int64 = function()
  117. local value, tPos = string.unpack(">i8", mBuf, mPos)
  118. mPos = tPos
  119. return value
  120. end
  121. -- 写64位整型
  122. ba.write_int64 = function(value)
  123. local value = string.pack(">i8", value)
  124. mBuf[mPos] = value
  125. mPos = mPos + 1
  126. end
  127. -- 读64位无符号整型
  128. ba.read_uint64 = function()
  129. local value, tPos = string.unpack(">I8", mBuf, mPos)
  130. mPos = tPos
  131. return value
  132. end
  133. -- 写64位无符号整型
  134. ba.write_uint64 = function(value)
  135. local value = string.pack(">I8", value)
  136. mBuf[mPos] = value
  137. mPos = mPos + 1
  138. end
  139. -- 读单精度浮点型
  140. ba.read_float = function()
  141. local value, tPos = string.unpack(">f", mBuf, mPos)
  142. mPos = tPos
  143. return value
  144. end
  145. -- 写单精度浮点型
  146. ba.write_float = function(value)
  147. local value = string.pack(">f", value)
  148. mBuf[mPos] = value
  149. mPos = mPos + 1
  150. end
  151. -- 读双精度浮点型
  152. ba.read_double = function()
  153. local value, tPos = string.unpack(">d", mBuf, mPos)
  154. mPos = tPos
  155. return value
  156. end
  157. -- 写双精度浮点型
  158. ba.write_double = function(value)
  159. local value = string.pack(">d", value)
  160. mBuf[mPos] = value
  161. mPos = mPos + 1
  162. end
  163. -- 读字符串
  164. ba.read_string = function()
  165. local value, tPos = string.unpack(">s2", mBuf, mPos)
  166. mPos = tPos
  167. return value
  168. end
  169. -- 写字符串
  170. ba.write_string = function(value)
  171. local value = string.pack(">s2", value)
  172. mBuf[mPos] = value
  173. mPos = mPos + 1
  174. end
  175. -- 读字整数
  176. ba.read_integer = function()
  177. local tag = read_int8()
  178. if tag == 8 then
  179. return read_int8()
  180. elseif tag == 16 then
  181. return read_int16()
  182. elseif tag == 32 then
  183. return read_int32()
  184. elseif tag == 64 then
  185. return read_int64()
  186. end
  187. end
  188. -- 写整数
  189. ba.write_integer = function(value)
  190. if value >= -128 and value <= 127 then
  191. write_int8(8)
  192. write_int8(value)
  193. elseif value >= -32768 and value <= 32767 then
  194. write_int8(16)
  195. write_int16(value)
  196. elseif value >= -2147483648 and value <= 2147483647 then
  197. write_int8(32)
  198. write_int32(value)
  199. elseif value >= -9223372036854775808 and value <= 9223372036854775807 then
  200. write_int8(64)
  201. write_int64(value)
  202. end
  203. end
  204. -- 读字数字
  205. ba.read_integer = function()
  206. local tag = read_int8()
  207. if tag == 8 then
  208. return read_int8()
  209. elseif tag == 16 then
  210. return read_int16()
  211. elseif tag == 32 then
  212. return read_int32()
  213. elseif tag == 64 then
  214. return read_int64()
  215. elseif tag == 33 then
  216. return read_float()
  217. elseif tag == 65 then
  218. return read_double()
  219. end
  220. end
  221. -- 写数字
  222. ba.write_integer = function(value)
  223. local valueType = math.type(value)
  224. if valueType == 'integer' then
  225. if value >= -128 and value <= 127 then
  226. write_int8(8)
  227. write_int8(value)
  228. elseif value >= -32768 and value <= 32767 then
  229. write_int8(16)
  230. write_int16(value)
  231. elseif value >= -2147483648 and value <= 2147483647 then
  232. write_int8(32)
  233. write_int32(value)
  234. elseif value >= -9223372036854775808 and value <= 9223372036854775807 then
  235. write_int8(64)
  236. write_int64(value)
  237. end
  238. elseif valueType == 'float' then
  239. if value >= 1.175494351e-38 and value <= 3.402823466e+38 then
  240. write_int8(33)
  241. write_float(value)
  242. elseif value >= 2.2250738585072014e-308 and value <= 1.7976931348623158e+308 then
  243. write_int8(65)
  244. write_float(value)
  245. end
  246. end
  247. end
  248. ----------------------------------------------------------------------
  249. return ba
  250. end