erlang自定义二进制协议
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.

664 lines
27 KiB

5 years ago
5 years ago
  1. -module(protoMsg).
  2. -compile([nowarn_unused_vars]).
  3. -export([encode/1, decode/1, encodeRec/1, decodeBin/2]).
  4. -define(min8, -128).
  5. -define(max8, 127).
  6. -define(min16, -32768).
  7. -define(max16, 32767).
  8. -define(min32, -2147483648).
  9. -define(max32, 2147483647).
  10. -define(min64, -9223372036854775808).
  11. -define(max64, 9223372036854775807).
  12. -define(minF32, -3.4E+38).
  13. -define(maxF32, 3.4E+38).
  14. -define(minF64, -1.797E-308).
  15. -define(maxF64, 1.797E+308).
  16. -define(int8(V), <<V:8>>).
  17. -define(uint8(V), <<V:8>>).
  18. -define(int16(V), <<V:16/big>>).
  19. -define(uint16(V), <<V:16/big>>).
  20. -define(int32(V), <<V:32/big>>).
  21. -define(uint32(V), <<V:32/big>>).
  22. -define(int64(V), <<V:64/big>>).
  23. -define(uint64(V), <<V:64/big>>).
  24. -define(integer(V), (integer(V))).
  25. -define(number(V), (number(V))).
  26. -define(string(V), (string(V))).
  27. -define(float(V), <<V:32/big-float>>).
  28. -define(double(V), <<V:64/big-float>>).
  29. -define(bool(V), (case V of true -> <<1:8>>; _ -> <<0:8>> end)).
  30. -define(record(V), (case V of undefined -> [<<0:8>>]; V -> [<<1:8>>, encodeRec(V)] end)).
  31. -define(list_bool(List), [<<(length(List)):16/big>>, [?bool(V) || V <- List]]).
  32. -define(list_int8(List), [<<(length(List)):16/big>>, [?int8(V) || V <- List]]).
  33. -define(list_uint8(List), [<<(length(List)):16/big>>, [?uint8(V) || V <- List]]).
  34. -define(list_int16(List), [<<(length(List)):16/big>>, [?int16(V) || V <- List]]).
  35. -define(list_uint16(List), [<<(length(List)):16/big>>, [?uint16(V) || V <- List]]).
  36. -define(list_int32(List), [<<(length(List)):16/big>>, [?int32(V) || V <- List]]).
  37. -define(list_uint32(List), [<<(length(List)):16/big>>, [?uint32(V) || V <- List]]).
  38. -define(list_int64(List), [<<(length(List)):16/big>>, [?int64(V) || V <- List]]).
  39. -define(list_uint64(List), [<<(length(List)):16/big>>, [?uint64(V) || V <- List]]).
  40. -define(list_float(List), [<<(length(List)):16/big>>, [?float(V) || V <- List]]).
  41. -define(list_double(List), [<<(length(List)):16/big>>, [?double(V) || V <- List]]).
  42. -define(list_integer(List), [<<(length(List)):16/big>>, [integer(V) || V <- List]]).
  43. -define(list_number(List), [<<(length(List)):16/big>>, [number(V) || V <- List]]).
  44. -define(list_string(List), [<<(length(List)):16/big>>, [string(V) || V <- List]]).
  45. -define(list_record(List), [<<(length(List)):16/big>>, [encodeRec(V) || V <- List]]).
  46. integer(V) ->
  47. if
  48. V >= ?min8 andalso V =< ?max8 ->
  49. <<8:8, <<V:8>>/binary>>;
  50. V >= ?min16 andalso V =< ?max16 ->
  51. <<16:8, <<V:16/big>>/binary>>;
  52. V >= ?min32 andalso V =< ?max32 ->
  53. <<32:8, <<V:32/big>>/binary>>;
  54. V >= ?min64 andalso V =< ?max64 ->
  55. <<64:8, <<V:64/big>>/binary>>;
  56. true ->
  57. throw(exceeded_the_integer)
  58. end.
  59. number(V) ->
  60. if
  61. erlang:is_integer(V) ->
  62. if
  63. V >= ?min8 andalso V =< ?max8 ->
  64. <<8:8, <<V:8>>/binary>>;
  65. V >= ?min16 andalso V =< ?max16 ->
  66. <<16:8, <<V:16/big>>/binary>>;
  67. V >= ?min32 andalso V =< ?max32 ->
  68. <<32:8, <<V:32/big>>/binary>>;
  69. V >= ?min64 andalso V =< ?max64 ->
  70. <<64:8, <<V:64/big>>/binary>>;
  71. true ->
  72. throw(exceeded_the_integer)
  73. end;
  74. erlang:is_float(V) ->
  75. if
  76. V >= ?minF32 andalso V =< ?maxF32 ->
  77. <<33:8, <<V:32/big-float>>/binary>>;
  78. V >= ?minF64 andalso V =< ?maxF64 ->
  79. <<65:8, <<V:64/big-float>>/binary>>;
  80. true ->
  81. throw(exceeded_the_float)
  82. end;
  83. true ->
  84. throw(is_not_number)
  85. end.
  86. string(Str) when is_binary(Str) ->
  87. [<<(byte_size(Str)):16/big>>, Str];
  88. string(Str) ->
  89. Str2 = unicode:characters_to_binary(Str, utf8),
  90. [<<(byte_size(Str2)):16/big>>, Str2].
  91. decode(Bin) ->
  92. <<MsgId:16/big, MsgBin/binary>> = Bin,
  93. decodeBin(MsgId, MsgBin).
  94. deIntegerList(0, MsgBin, RetList) ->
  95. {lists:reverse(RetList), MsgBin};
  96. deIntegerList(N, MsgBin, RetList) ->
  97. <<IntBits:8, Int:IntBits/big-signed, LeftBin/binary>> = MsgBin,
  98. deIntegerList(N - 1, LeftBin, [Int | RetList]).
  99. deNumberList(0, MsgBin, RetList) ->
  100. {lists:reverse(RetList), MsgBin};
  101. deNumberList(N, MsgBin, RetList) ->
  102. <<NumBits:8, NumBin/binary>> = MsgBin,
  103. case NumBits of
  104. 33 ->
  105. <<Float:32/big-float, LeftBin/binary>> = NumBin,
  106. deNumberList(N - 1, LeftBin, [Float | RetList]);
  107. 65 ->
  108. <<Float:64/big-float, LeftBin/binary>> = NumBin,
  109. deNumberList(N - 1, LeftBin, [Float | RetList]);
  110. _ ->
  111. <<Int:NumBits/big-signed, LeftBin/binary>> = NumBin,
  112. deNumberList(N - 1, LeftBin, [Int | RetList])
  113. end.
  114. deStringList(0, MsgBin, RetList) ->
  115. {lists:reverse(RetList), MsgBin};
  116. deStringList(N, MsgBin, RetList) ->
  117. <<Len:16/big, StrBin:Len/binary-unit:8, LeftBin/binary>> = MsgBin,
  118. deStringList(N - 1, LeftBin, [StrBin | RetList]).
  119. deRecordList(0, _MsgId, MsgBin, RetList) ->
  120. {lists:reverse(RetList), MsgBin};
  121. deRecordList(N, MsgId, MsgBin, RetList) ->
  122. {Tuple, LeftBin} = decodeRec(MsgId, MsgBin),
  123. deRecordList(N - 1, MsgId, LeftBin, [Tuple | RetList]).
  124. encodeRec({test, V1}) ->
  125. [?string(V1)];
  126. encodeRec({phoneNumber, V1, V2}) ->
  127. [?record(V1), ?int32(V2)];
  128. encodeRec({person, V1, V2, V3, V4}) ->
  129. [?string(V1), ?int32(V2), ?string(V3), ?list_record(V4)];
  130. encodeRec({union, V1, V2}) ->
  131. [?string(V1), ?int32(V2)];
  132. encodeRec(_) ->
  133. [].
  134. encode({test, V1}) ->
  135. [<<1:16/big-unsigned>>, ?string(V1)];
  136. encode({phoneNumber, V1, V2}) ->
  137. [<<2:16/big-unsigned>>, ?record(V1), ?int32(V2)];
  138. encode({person, V1, V2, V3, V4}) ->
  139. [<<3:16/big-unsigned>>, ?string(V1), ?int32(V2), ?string(V3), ?list_record(V4)];
  140. encode({addressBook, V1, V2}) ->
  141. [<<4:16/big-unsigned>>, ?list_record(V1), ?list_record(V2)];
  142. encode({union, V1, V2}) ->
  143. [<<5:16/big-unsigned>>, ?string(V1), ?int32(V2)];
  144. encode({tbool, V1}) ->
  145. [<<6:16/big-unsigned>>, ?bool(V1)];
  146. encode({tint8, V1, V2}) ->
  147. [<<7:16/big-unsigned>>, ?int8(V1), ?int8(V2)];
  148. encode({tuint8, V1, V2}) ->
  149. [<<8:16/big-unsigned>>, ?uint8(V1), ?uint8(V2)];
  150. encode({tint16, V1, V2}) ->
  151. [<<9:16/big-unsigned>>, ?int16(V1), ?int16(V2)];
  152. encode({tuint16, V1, V2}) ->
  153. [<<10:16/big-unsigned>>, ?uint16(V1), ?uint16(V2)];
  154. encode({tint32, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10}) ->
  155. [<<11:16/big-unsigned>>, ?int32(V1), ?int32(V2), ?int32(V3), ?int32(V4), ?int32(V5), ?int32(V6), ?int32(V7), ?int32(V8), ?int32(V9), ?int32(V10)];
  156. encode({tuint32, V1, V2}) ->
  157. [<<12:16/big-unsigned>>, ?uint32(V1), ?uint32(V2)];
  158. encode({tint64, V1, V2}) ->
  159. [<<13:16/big-unsigned>>, ?int64(V1), ?int64(V2)];
  160. encode({tuint64, V1, V2}) ->
  161. [<<14:16/big-unsigned>>, ?uint64(V1), ?uint64(V2)];
  162. encode({tinteger, V1, V2, V3, V4, V5, V6, V7, V8}) ->
  163. [<<15:16/big-unsigned>>, ?integer(V1), ?integer(V2), ?integer(V3), ?integer(V4), ?integer(V5), ?integer(V6), ?integer(V7), ?integer(V8)];
  164. encode({tnumber, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10}) ->
  165. [<<16:16/big-unsigned>>, ?number(V1), ?number(V2), ?number(V3), ?number(V4), ?number(V5), ?number(V6), ?number(V7), ?number(V8), ?number(V9), ?number(V10)];
  166. encode({tfloat, V1, V2}) ->
  167. [<<17:16/big-unsigned>>, ?float(V1), ?float(V2)];
  168. encode({tdouble, V1, V2}) ->
  169. [<<18:16/big-unsigned>>, ?double(V1), ?double(V2)];
  170. encode({tstring, V1, V2}) ->
  171. [<<19:16/big-unsigned>>, ?string(V1), ?string(V2)];
  172. encode({tlistbool, V1}) ->
  173. [<<20:16/big-unsigned>>, ?list_bool(V1)];
  174. encode({tlistint8, V1}) ->
  175. [<<21:16/big-unsigned>>, ?list_int8(V1)];
  176. encode({tlistuint8, V1}) ->
  177. [<<22:16/big-unsigned>>, ?list_uint8(V1)];
  178. encode({tlistint16, V1}) ->
  179. [<<23:16/big-unsigned>>, ?list_int16(V1)];
  180. encode({tlistuint16, V1}) ->
  181. [<<24:16/big-unsigned>>, ?list_uint16(V1)];
  182. encode({tlistint32, V1}) ->
  183. [<<25:16/big-unsigned>>, ?list_int32(V1)];
  184. encode({tlistuint32, V1}) ->
  185. [<<26:16/big-unsigned>>, ?list_uint32(V1)];
  186. encode({tlistint64, V1}) ->
  187. [<<27:16/big-unsigned>>, ?list_int64(V1)];
  188. encode({tlistuint64, V1}) ->
  189. [<<28:16/big-unsigned>>, ?list_uint64(V1)];
  190. encode({tlistinteger, V1}) ->
  191. [<<29:16/big-unsigned>>, ?list_integer(V1)];
  192. encode({tlistnumber, V1}) ->
  193. [<<30:16/big-unsigned>>, ?list_number(V1)];
  194. encode({tlistfloat, V1}) ->
  195. [<<31:16/big-unsigned>>, ?list_float(V1)];
  196. encode({tlistdouble, V1}) ->
  197. [<<32:16/big-unsigned>>, ?list_double(V1)];
  198. encode({tliststring, V1}) ->
  199. [<<33:16/big-unsigned>>, ?list_string(V1)];
  200. encode({tlistunion, V1}) ->
  201. [<<34:16/big-unsigned>>, ?list_record(V1)];
  202. encode({allType, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V50, V51, V52, V53, V54, V55}) ->
  203. [<<35:16/big-unsigned>>, ?bool(V1), ?int8(V2), ?uint8(V3), ?int16(V4), ?uint16(V5), ?int32(V6), ?uint32(V7), ?int64(V8), ?uint64(V9), ?integer(V10), ?integer(V11), ?integer(V12), ?integer(V13), ?integer(V14), ?integer(V15), ?integer(V16), ?integer(V17), ?number(V18), ?number(V19), ?number(V20), ?number(V21), ?number(V22), ?number(V23), ?number(V24), ?number(V25), ?number(V26), ?number(V27), ?float(V28), ?double(V29), ?string(V30), ?string(V31), ?record(V32), ?list_bool(V33), ?list_int8(V34), ?list_uint8(V35), ?list_int16(V36), ?list_uint16(V37), ?list_int32(V38), ?list_uint32(V39), ?list_int64(V40), ?list_uint64(V41), ?list_integer(V42), ?list_integer(V43), ?list_integer(V44), ?list_integer(V45), ?list_number(V46), ?list_number(V47), ?list_number(V48), ?list_number(V49), ?list_number(V50), ?list_number(V51), ?list_float(V52), ?list_double(V53), ?list_string(V54), ?list_record(V55)];
  204. encode({person1, V1, V2, V3, V4}) ->
  205. [<<1001:16/big-unsigned>>, ?string(V1), ?int32(V2), ?string(V3), ?list_record(V4)];
  206. encode(_) ->
  207. [].
  208. decodeRec(1, LeftBin0) ->
  209. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  210. MsgRec = {test, V1},
  211. {MsgRec, LeftBin1};
  212. decodeRec(2, LeftBin0) ->
  213. <<IsUndef1:8/big-unsigned, LeftBin1/binary>> = LeftBin0,
  214. case IsUndef1 of
  215. 0 ->
  216. V1 = undefined,
  217. LeftBin2 = LeftBin1 ;
  218. _ ->
  219. {V1, LeftBin2} = decodeRec(1, LeftBin1)
  220. end,
  221. <<V2:32/big-signed, LeftBin3/binary>> = LeftBin2,
  222. MsgRec = {phoneNumber, V1, V2},
  223. {MsgRec, LeftBin3};
  224. decodeRec(3, LeftBin0) ->
  225. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  226. <<V2:32/big-signed, LeftBin2/binary>> = LeftBin1,
  227. <<Len2:16/big-unsigned, V3:Len2/binary, LeftBin3/binary>> = LeftBin2,
  228. <<Len3:16/big-unsigned, LeftBin4/binary>> = LeftBin3,
  229. {V4, LeftBin5} = deRecordList(Len3, 2, LeftBin4, []),
  230. MsgRec = {person, V1, V2, V3, V4},
  231. {MsgRec, LeftBin5};
  232. decodeRec(5, LeftBin0) ->
  233. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  234. <<V2:32/big-signed, LeftBin2/binary>> = LeftBin1,
  235. MsgRec = {union, V1, V2},
  236. {MsgRec, LeftBin2};
  237. decodeRec(_, _) ->
  238. {{}, <<>>}.
  239. decodeBin(1, LeftBin0) ->
  240. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  241. {test, V1};
  242. decodeBin(2, LeftBin0) ->
  243. <<IsUndef1:8/big-unsigned, LeftBin1/binary>> = LeftBin0,
  244. case IsUndef1 of
  245. 0 ->
  246. V1 = undefined,
  247. LeftBin2 = LeftBin1 ;
  248. _ ->
  249. {V1, LeftBin2} = decodeRec(1, LeftBin1)
  250. end,
  251. <<V2:32/big-signed, LeftBin3/binary>> = LeftBin2,
  252. {phoneNumber, V1, V2};
  253. decodeBin(3, LeftBin0) ->
  254. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  255. <<V2:32/big-signed, LeftBin2/binary>> = LeftBin1,
  256. <<Len2:16/big-unsigned, V3:Len2/binary, LeftBin3/binary>> = LeftBin2,
  257. <<Len3:16/big-unsigned, LeftBin4/binary>> = LeftBin3,
  258. {V4, LeftBin5} = deRecordList(Len3, 2, LeftBin4, []),
  259. {person, V1, V2, V3, V4};
  260. decodeBin(4, LeftBin0) ->
  261. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  262. {V1, LeftBin2} = deRecordList(Len1, 3, LeftBin1, []),
  263. <<Len2:16/big-unsigned, LeftBin3/binary>> = LeftBin2,
  264. {V2, LeftBin4} = deRecordList(Len2, 3, LeftBin3, []),
  265. {addressBook, V1, V2};
  266. decodeBin(5, LeftBin0) ->
  267. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  268. <<V2:32/big-signed, LeftBin2/binary>> = LeftBin1,
  269. {union, V1, V2};
  270. decodeBin(6, LeftBin0) ->
  271. <<Bool1:8/big-unsigned, LeftBin1/binary>> = LeftBin0,
  272. V1 = Bool1 =:= 1,
  273. {tbool, V1};
  274. decodeBin(7, LeftBin0) ->
  275. <<V1:8/big-signed, V2:8/big-signed, LeftBin1/binary>> = LeftBin0,
  276. {tint8, V1, V2};
  277. decodeBin(8, LeftBin0) ->
  278. <<V1:8/big-unsigned, V2:8/big-unsigned, LeftBin1/binary>> = LeftBin0,
  279. {tuint8, V1, V2};
  280. decodeBin(9, LeftBin0) ->
  281. <<V1:16/big-signed, V2:16/big-signed, LeftBin1/binary>> = LeftBin0,
  282. {tint16, V1, V2};
  283. decodeBin(10, LeftBin0) ->
  284. <<V1:16/big-unsigned, V2:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  285. {tuint16, V1, V2};
  286. decodeBin(11, LeftBin0) ->
  287. <<V1:32/big-signed, V2:32/big-signed, V3:32/big-signed, V4:32/big-signed, V5:32/big-signed, V6:32/big-signed, V7:32/big-signed, V8:32/big-signed, V9:32/big-signed, V10:32/big-signed, LeftBin1/binary>> = LeftBin0,
  288. {tint32, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10};
  289. decodeBin(12, LeftBin0) ->
  290. <<V1:32/big-unsigned, V2:32/big-unsigned, LeftBin1/binary>> = LeftBin0,
  291. {tuint32, V1, V2};
  292. decodeBin(13, LeftBin0) ->
  293. <<V1:64/big-signed, V2:64/big-signed, LeftBin1/binary>> = LeftBin0,
  294. {tint64, V1, V2};
  295. decodeBin(14, LeftBin0) ->
  296. <<V1:64/big-unsigned, V2:64/big-unsigned, LeftBin1/binary>> = LeftBin0,
  297. {tuint64, V1, V2};
  298. decodeBin(15, LeftBin0) ->
  299. <<IntBits1:8, V1:IntBits1/big-signed, IntBits2:8, V2:IntBits2/big-signed, IntBits3:8, V3:IntBits3/big-signed, IntBits4:8, V4:IntBits4/big-signed, IntBits5:8, V5:IntBits5/big-signed, IntBits6:8, V6:IntBits6/big-signed, IntBits7:8, V7:IntBits7/big-signed, IntBits8:8, V8:IntBits8/big-signed, LeftBin1/binary>> = LeftBin0,
  300. {tinteger, V1, V2, V3, V4, V5, V6, V7, V8};
  301. decodeBin(16, LeftBin0) ->
  302. <<NumBits1:8, LeftBin1/binary>> = LeftBin0,
  303. case NumBits1 of
  304. 33->
  305. <<V1:32/big-float, LeftBin2/binary>> = LeftBin1;
  306. 65 ->
  307. <<V1:64/big-float, LeftBin2/binary>> = LeftBin1;
  308. _ ->
  309. <<V1:NumBits1/big-signed, LeftBin2/binary>> = LeftBin1
  310. end,
  311. <<NumBits2:8, LeftBin3/binary>> = LeftBin2,
  312. case NumBits2 of
  313. 33->
  314. <<V2:32/big-float, LeftBin4/binary>> = LeftBin3;
  315. 65 ->
  316. <<V2:64/big-float, LeftBin4/binary>> = LeftBin3;
  317. _ ->
  318. <<V2:NumBits2/big-signed, LeftBin4/binary>> = LeftBin3
  319. end,
  320. <<NumBits3:8, LeftBin5/binary>> = LeftBin4,
  321. case NumBits3 of
  322. 33->
  323. <<V3:32/big-float, LeftBin6/binary>> = LeftBin5;
  324. 65 ->
  325. <<V3:64/big-float, LeftBin6/binary>> = LeftBin5;
  326. _ ->
  327. <<V3:NumBits3/big-signed, LeftBin6/binary>> = LeftBin5
  328. end,
  329. <<NumBits4:8, LeftBin7/binary>> = LeftBin6,
  330. case NumBits4 of
  331. 33->
  332. <<V4:32/big-float, LeftBin8/binary>> = LeftBin7;
  333. 65 ->
  334. <<V4:64/big-float, LeftBin8/binary>> = LeftBin7;
  335. _ ->
  336. <<V4:NumBits4/big-signed, LeftBin8/binary>> = LeftBin7
  337. end,
  338. <<NumBits5:8, LeftBin9/binary>> = LeftBin8,
  339. case NumBits5 of
  340. 33->
  341. <<V5:32/big-float, LeftBin10/binary>> = LeftBin9;
  342. 65 ->
  343. <<V5:64/big-float, LeftBin10/binary>> = LeftBin9;
  344. _ ->
  345. <<V5:NumBits5/big-signed, LeftBin10/binary>> = LeftBin9
  346. end,
  347. <<NumBits6:8, LeftBin11/binary>> = LeftBin10,
  348. case NumBits6 of
  349. 33->
  350. <<V6:32/big-float, LeftBin12/binary>> = LeftBin11;
  351. 65 ->
  352. <<V6:64/big-float, LeftBin12/binary>> = LeftBin11;
  353. _ ->
  354. <<V6:NumBits6/big-signed, LeftBin12/binary>> = LeftBin11
  355. end,
  356. <<NumBits7:8, LeftBin13/binary>> = LeftBin12,
  357. case NumBits7 of
  358. 33->
  359. <<V7:32/big-float, LeftBin14/binary>> = LeftBin13;
  360. 65 ->
  361. <<V7:64/big-float, LeftBin14/binary>> = LeftBin13;
  362. _ ->
  363. <<V7:NumBits7/big-signed, LeftBin14/binary>> = LeftBin13
  364. end,
  365. <<NumBits8:8, LeftBin15/binary>> = LeftBin14,
  366. case NumBits8 of
  367. 33->
  368. <<V8:32/big-float, LeftBin16/binary>> = LeftBin15;
  369. 65 ->
  370. <<V8:64/big-float, LeftBin16/binary>> = LeftBin15;
  371. _ ->
  372. <<V8:NumBits8/big-signed, LeftBin16/binary>> = LeftBin15
  373. end,
  374. <<NumBits9:8, LeftBin17/binary>> = LeftBin16,
  375. case NumBits9 of
  376. 33->
  377. <<V9:32/big-float, LeftBin18/binary>> = LeftBin17;
  378. 65 ->
  379. <<V9:64/big-float, LeftBin18/binary>> = LeftBin17;
  380. _ ->
  381. <<V9:NumBits9/big-signed, LeftBin18/binary>> = LeftBin17
  382. end,
  383. <<NumBits10:8, LeftBin19/binary>> = LeftBin18,
  384. case NumBits10 of
  385. 33->
  386. <<V10:32/big-float, LeftBin20/binary>> = LeftBin19;
  387. 65 ->
  388. <<V10:64/big-float, LeftBin20/binary>> = LeftBin19;
  389. _ ->
  390. <<V10:NumBits10/big-signed, LeftBin20/binary>> = LeftBin19
  391. end,
  392. {tnumber, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10};
  393. decodeBin(17, LeftBin0) ->
  394. <<V1:32/big-float, V2:32/big-float, LeftBin1/binary>> = LeftBin0,
  395. {tfloat, V1, V2};
  396. decodeBin(18, LeftBin0) ->
  397. <<V1:64/big-float, V2:64/big-float, LeftBin1/binary>> = LeftBin0,
  398. {tdouble, V1, V2};
  399. decodeBin(19, LeftBin0) ->
  400. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  401. <<Len2:16/big-unsigned, V2:Len2/binary, LeftBin2/binary>> = LeftBin1,
  402. {tstring, V1, V2};
  403. decodeBin(20, LeftBin0) ->
  404. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  405. <<ListBin1:Len1/big-binary-unit:8, LeftBin2/binary>> = LeftBin1,
  406. V1 = [TemV =:= 1 || <<TemV:8/big-unsigned>> <= ListBin1],
  407. {tlistbool, V1};
  408. decodeBin(21, LeftBin0) ->
  409. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  410. <<ListBin1:Len1/big-binary-unit:8, LeftBin2/binary>> = LeftBin1,
  411. V1 = [TemV || <<TemV:8/big-signed>> <= ListBin1],
  412. {tlistint8, V1};
  413. decodeBin(22, LeftBin0) ->
  414. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  415. <<ListBin1:Len1/big-binary-unit:8, LeftBin2/binary>> = LeftBin1,
  416. V1 = [TemV || <<TemV:8/big-unsigned>> <= ListBin1],
  417. {tlistuint8, V1};
  418. decodeBin(23, LeftBin0) ->
  419. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  420. <<ListBin1:Len1/big-binary-unit:16, LeftBin2/binary>> = LeftBin1,
  421. V1 = [TemV || <<TemV:16/big-signed>> <= ListBin1],
  422. {tlistint16, V1};
  423. decodeBin(24, LeftBin0) ->
  424. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  425. <<ListBin1:Len1/big-binary-unit:16, LeftBin2/binary>> = LeftBin1,
  426. V1 = [TemV || <<TemV:16/big-unsigned>> <= ListBin1],
  427. {tlistuint16, V1};
  428. decodeBin(25, LeftBin0) ->
  429. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  430. <<ListBin1:Len1/big-binary-unit:32, LeftBin2/binary>> = LeftBin1,
  431. V1 = [TemV || <<TemV:32/big-signed>> <= ListBin1],
  432. {tlistint32, V1};
  433. decodeBin(26, LeftBin0) ->
  434. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  435. <<ListBin1:Len1/big-binary-unit:32, LeftBin2/binary>> = LeftBin1,
  436. V1 = [TemV || <<TemV:32/big-unsigned>> <= ListBin1],
  437. {tlistuint32, V1};
  438. decodeBin(27, LeftBin0) ->
  439. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  440. <<ListBin1:Len1/big-binary-unit:64, LeftBin2/binary>> = LeftBin1,
  441. V1 = [TemV || <<TemV:64/big-signed>> <= ListBin1],
  442. {tlistint64, V1};
  443. decodeBin(28, LeftBin0) ->
  444. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  445. <<ListBin1:Len1/big-binary-unit:64, LeftBin2/binary>> = LeftBin1,
  446. V1 = [TemV || <<TemV:64/big-unsigned>> <= ListBin1],
  447. {tlistuint64, V1};
  448. decodeBin(29, LeftBin0) ->
  449. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  450. {V1, LeftBin2} = deIntegerList(Len1, LeftBin1, []),
  451. {tlistinteger, V1};
  452. decodeBin(30, LeftBin0) ->
  453. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  454. {V1, LeftBin2} = deNumberList(Len1, LeftBin1, []),
  455. {tlistnumber, V1};
  456. decodeBin(31, LeftBin0) ->
  457. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  458. <<ListBin1:Len1/big-binary-unit:32, LeftBin2/binary>> = LeftBin1,
  459. V1 = [TemV || <<TemV:32/big-float>> <= ListBin1],
  460. {tlistfloat, V1};
  461. decodeBin(32, LeftBin0) ->
  462. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  463. <<ListBin1:Len1/big-binary-unit:64, LeftBin2/binary>> = LeftBin1,
  464. V1 = [TemV || <<TemV:64/big-float>> <= ListBin1],
  465. {tlistdouble, V1};
  466. decodeBin(33, LeftBin0) ->
  467. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  468. {V1, LeftBin2} = deStringList(Len1, LeftBin1, []),
  469. {tliststring, V1};
  470. decodeBin(34, LeftBin0) ->
  471. <<Len1:16/big-unsigned, LeftBin1/binary>> = LeftBin0,
  472. {V1, LeftBin2} = deRecordList(Len1, 5, LeftBin1, []),
  473. {tlistunion, V1};
  474. decodeBin(35, LeftBin0) ->
  475. <<Bool1:8/big-unsigned, LeftBin1/binary>> = LeftBin0,
  476. V1 = Bool1 =:= 1,
  477. <<V2:8/big-signed, V3:8/big-unsigned, V4:16/big-signed, V5:16/big-unsigned, V6:32/big-signed, V7:32/big-unsigned, V8:64/big-signed, V9:64/big-unsigned, IntBits1:8, V10:IntBits1/big-signed, IntBits2:8, V11:IntBits2/big-signed, IntBits3:8, V12:IntBits3/big-signed, IntBits4:8, V13:IntBits4/big-signed, IntBits5:8, V14:IntBits5/big-signed, IntBits6:8, V15:IntBits6/big-signed, IntBits7:8, V16:IntBits7/big-signed, IntBits8:8, V17:IntBits8/big-signed, LeftBin2/binary>> = LeftBin1,
  478. <<NumBits1:8, LeftBin3/binary>> = LeftBin2,
  479. case NumBits1 of
  480. 33->
  481. <<V18:32/big-float, LeftBin4/binary>> = LeftBin3;
  482. 65 ->
  483. <<V18:64/big-float, LeftBin4/binary>> = LeftBin3;
  484. _ ->
  485. <<V18:NumBits1/big-signed, LeftBin4/binary>> = LeftBin3
  486. end,
  487. <<NumBits2:8, LeftBin5/binary>> = LeftBin4,
  488. case NumBits2 of
  489. 33->
  490. <<V19:32/big-float, LeftBin6/binary>> = LeftBin5;
  491. 65 ->
  492. <<V19:64/big-float, LeftBin6/binary>> = LeftBin5;
  493. _ ->
  494. <<V19:NumBits2/big-signed, LeftBin6/binary>> = LeftBin5
  495. end,
  496. <<NumBits3:8, LeftBin7/binary>> = LeftBin6,
  497. case NumBits3 of
  498. 33->
  499. <<V20:32/big-float, LeftBin8/binary>> = LeftBin7;
  500. 65 ->
  501. <<V20:64/big-float, LeftBin8/binary>> = LeftBin7;
  502. _ ->
  503. <<V20:NumBits3/big-signed, LeftBin8/binary>> = LeftBin7
  504. end,
  505. <<NumBits4:8, LeftBin9/binary>> = LeftBin8,
  506. case NumBits4 of
  507. 33->
  508. <<V21:32/big-float, LeftBin10/binary>> = LeftBin9;
  509. 65 ->
  510. <<V21:64/big-float, LeftBin10/binary>> = LeftBin9;
  511. _ ->
  512. <<V21:NumBits4/big-signed, LeftBin10/binary>> = LeftBin9
  513. end,
  514. <<NumBits5:8, LeftBin11/binary>> = LeftBin10,
  515. case NumBits5 of
  516. 33->
  517. <<V22:32/big-float, LeftBin12/binary>> = LeftBin11;
  518. 65 ->
  519. <<V22:64/big-float, LeftBin12/binary>> = LeftBin11;
  520. _ ->
  521. <<V22:NumBits5/big-signed, LeftBin12/binary>> = LeftBin11
  522. end,
  523. <<NumBits6:8, LeftBin13/binary>> = LeftBin12,
  524. case NumBits6 of
  525. 33->
  526. <<V23:32/big-float, LeftBin14/binary>> = LeftBin13;
  527. 65 ->
  528. <<V23:64/big-float, LeftBin14/binary>> = LeftBin13;
  529. _ ->
  530. <<V23:NumBits6/big-signed, LeftBin14/binary>> = LeftBin13
  531. end,
  532. <<NumBits7:8, LeftBin15/binary>> = LeftBin14,
  533. case NumBits7 of
  534. 33->
  535. <<V24:32/big-float, LeftBin16/binary>> = LeftBin15;
  536. 65 ->
  537. <<V24:64/big-float, LeftBin16/binary>> = LeftBin15;
  538. _ ->
  539. <<V24:NumBits7/big-signed, LeftBin16/binary>> = LeftBin15
  540. end,
  541. <<NumBits8:8, LeftBin17/binary>> = LeftBin16,
  542. case NumBits8 of
  543. 33->
  544. <<V25:32/big-float, LeftBin18/binary>> = LeftBin17;
  545. 65 ->
  546. <<V25:64/big-float, LeftBin18/binary>> = LeftBin17;
  547. _ ->
  548. <<V25:NumBits8/big-signed, LeftBin18/binary>> = LeftBin17
  549. end,
  550. <<NumBits9:8, LeftBin19/binary>> = LeftBin18,
  551. case NumBits9 of
  552. 33->
  553. <<V26:32/big-float, LeftBin20/binary>> = LeftBin19;
  554. 65 ->
  555. <<V26:64/big-float, LeftBin20/binary>> = LeftBin19;
  556. _ ->
  557. <<V26:NumBits9/big-signed, LeftBin20/binary>> = LeftBin19
  558. end,
  559. <<NumBits10:8, LeftBin21/binary>> = LeftBin20,
  560. case NumBits10 of
  561. 33->
  562. <<V27:32/big-float, LeftBin22/binary>> = LeftBin21;
  563. 65 ->
  564. <<V27:64/big-float, LeftBin22/binary>> = LeftBin21;
  565. _ ->
  566. <<V27:NumBits10/big-signed, LeftBin22/binary>> = LeftBin21
  567. end,
  568. <<V28:32/big-float, V29:64/big-float, LeftBin23/binary>> = LeftBin22,
  569. <<Len1:16/big-unsigned, V30:Len1/binary, LeftBin24/binary>> = LeftBin23,
  570. <<Len2:16/big-unsigned, V31:Len2/binary, LeftBin25/binary>> = LeftBin24,
  571. <<IsUndef1:8/big-unsigned, LeftBin26/binary>> = LeftBin25,
  572. case IsUndef1 of
  573. 0 ->
  574. V32 = undefined,
  575. LeftBin27 = LeftBin26 ;
  576. _ ->
  577. {V32, LeftBin27} = decodeRec(5, LeftBin26)
  578. end,
  579. <<Len3:16/big-unsigned, LeftBin28/binary>> = LeftBin27,
  580. <<ListBin1:Len3/big-binary-unit:8, LeftBin29/binary>> = LeftBin28,
  581. V33 = [TemV =:= 1 || <<TemV:8/big-unsigned>> <= ListBin1],
  582. <<Len4:16/big-unsigned, LeftBin30/binary>> = LeftBin29,
  583. <<ListBin2:Len4/big-binary-unit:8, LeftBin31/binary>> = LeftBin30,
  584. V34 = [TemV || <<TemV:8/big-signed>> <= ListBin2],
  585. <<Len5:16/big-unsigned, LeftBin32/binary>> = LeftBin31,
  586. <<ListBin3:Len5/big-binary-unit:8, LeftBin33/binary>> = LeftBin32,
  587. V35 = [TemV || <<TemV:8/big-unsigned>> <= ListBin3],
  588. <<Len6:16/big-unsigned, LeftBin34/binary>> = LeftBin33,
  589. <<ListBin4:Len6/big-binary-unit:16, LeftBin35/binary>> = LeftBin34,
  590. V36 = [TemV || <<TemV:16/big-signed>> <= ListBin4],
  591. <<Len7:16/big-unsigned, LeftBin36/binary>> = LeftBin35,
  592. <<ListBin5:Len7/big-binary-unit:16, LeftBin37/binary>> = LeftBin36,
  593. V37 = [TemV || <<TemV:16/big-unsigned>> <= ListBin5],
  594. <<Len8:16/big-unsigned, LeftBin38/binary>> = LeftBin37,
  595. <<ListBin6:Len8/big-binary-unit:32, LeftBin39/binary>> = LeftBin38,
  596. V38 = [TemV || <<TemV:32/big-signed>> <= ListBin6],
  597. <<Len9:16/big-unsigned, LeftBin40/binary>> = LeftBin39,
  598. <<ListBin7:Len9/big-binary-unit:32, LeftBin41/binary>> = LeftBin40,
  599. V39 = [TemV || <<TemV:32/big-unsigned>> <= ListBin7],
  600. <<Len10:16/big-unsigned, LeftBin42/binary>> = LeftBin41,
  601. <<ListBin8:Len10/big-binary-unit:64, LeftBin43/binary>> = LeftBin42,
  602. V40 = [TemV || <<TemV:64/big-signed>> <= ListBin8],
  603. <<Len11:16/big-unsigned, LeftBin44/binary>> = LeftBin43,
  604. <<ListBin9:Len11/big-binary-unit:64, LeftBin45/binary>> = LeftBin44,
  605. V41 = [TemV || <<TemV:64/big-unsigned>> <= ListBin9],
  606. <<Len12:16/big-unsigned, LeftBin46/binary>> = LeftBin45,
  607. {V42, LeftBin47} = deIntegerList(Len12, LeftBin46, []),
  608. <<Len13:16/big-unsigned, LeftBin48/binary>> = LeftBin47,
  609. {V43, LeftBin49} = deIntegerList(Len13, LeftBin48, []),
  610. <<Len14:16/big-unsigned, LeftBin50/binary>> = LeftBin49,
  611. {V44, LeftBin51} = deIntegerList(Len14, LeftBin50, []),
  612. <<Len15:16/big-unsigned, LeftBin52/binary>> = LeftBin51,
  613. {V45, LeftBin53} = deIntegerList(Len15, LeftBin52, []),
  614. <<Len16:16/big-unsigned, LeftBin54/binary>> = LeftBin53,
  615. {V46, LeftBin55} = deNumberList(Len16, LeftBin54, []),
  616. <<Len17:16/big-unsigned, LeftBin56/binary>> = LeftBin55,
  617. {V47, LeftBin57} = deNumberList(Len17, LeftBin56, []),
  618. <<Len18:16/big-unsigned, LeftBin58/binary>> = LeftBin57,
  619. {V48, LeftBin59} = deNumberList(Len18, LeftBin58, []),
  620. <<Len19:16/big-unsigned, LeftBin60/binary>> = LeftBin59,
  621. {V49, LeftBin61} = deNumberList(Len19, LeftBin60, []),
  622. <<Len20:16/big-unsigned, LeftBin62/binary>> = LeftBin61,
  623. {V50, LeftBin63} = deNumberList(Len20, LeftBin62, []),
  624. <<Len21:16/big-unsigned, LeftBin64/binary>> = LeftBin63,
  625. {V51, LeftBin65} = deNumberList(Len21, LeftBin64, []),
  626. <<Len22:16/big-unsigned, LeftBin66/binary>> = LeftBin65,
  627. <<ListBin20:Len22/big-binary-unit:32, LeftBin67/binary>> = LeftBin66,
  628. V52 = [TemV || <<TemV:32/big-float>> <= ListBin20],
  629. <<Len23:16/big-unsigned, LeftBin68/binary>> = LeftBin67,
  630. <<ListBin21:Len23/big-binary-unit:64, LeftBin69/binary>> = LeftBin68,
  631. V53 = [TemV || <<TemV:64/big-float>> <= ListBin21],
  632. <<Len24:16/big-unsigned, LeftBin70/binary>> = LeftBin69,
  633. {V54, LeftBin71} = deStringList(Len24, LeftBin70, []),
  634. <<Len25:16/big-unsigned, LeftBin72/binary>> = LeftBin71,
  635. {V55, LeftBin73} = deRecordList(Len25, 5, LeftBin72, []),
  636. {allType, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V50, V51, V52, V53, V54, V55};
  637. decodeBin(1001, LeftBin0) ->
  638. <<Len1:16/big-unsigned, V1:Len1/binary, LeftBin1/binary>> = LeftBin0,
  639. <<V2:32/big-signed, LeftBin2/binary>> = LeftBin1,
  640. <<Len2:16/big-unsigned, V3:Len2/binary, LeftBin3/binary>> = LeftBin2,
  641. <<Len3:16/big-unsigned, LeftBin4/binary>> = LeftBin3,
  642. {V4, LeftBin5} = deRecordList(Len3, 2, LeftBin4, []),
  643. {person1, V1, V2, V3, V4};
  644. decodeBin(_, _) ->
  645. {{}, <<>>}.