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.

555 regels
23 KiB

  1. using JT808.Protocol.MessagePack;
  2. using JT808.Protocol.Extensions;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using Xunit;
  7. using System.Buffers;
  8. using JT808.Protocol.Enums;
  9. using System.Buffers.Binary;
  10. namespace JT808.Protocol.Test.MessagePack
  11. {
  12. public class JT808MessagePackWriterTest
  13. {
  14. [Fact]
  15. public void WriteEncodeTest()
  16. {
  17. byte[] array = new byte[4096];
  18. var msgpackWriter = new JT808MessagePackWriter(array);
  19. msgpackWriter.WriteStart();
  20. msgpackWriter.WriteByte(0x7E);
  21. msgpackWriter.WriteByte(0x7D);
  22. msgpackWriter.WriteByte(0x7E);
  23. msgpackWriter.WriteByte(0x7D);
  24. msgpackWriter.WriteEnd();
  25. msgpackWriter.WriteEncode();
  26. //===========output=========
  27. //Unencode:
  28. //7E 7E 7D 7E 7D 7E
  29. //Encode
  30. //7E 7D 02 7D 01 7D 02 7D 01 7E
  31. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  32. Assert.Equal("7E 7E 7D 7E 7D 7E 7E 7D 02 7D 01 7D 02 7D 01 7E".Replace(" ", ""), realBytes);
  33. }
  34. [Fact]
  35. public void WriteEncodeTest1()
  36. {
  37. byte[] array = new byte[4096];
  38. var msgpackWriter = new JT808MessagePackWriter(array);
  39. msgpackWriter.WriteByte(0x7E);
  40. msgpackWriter.WriteByte(0x7D);
  41. msgpackWriter.WriteByte(0x7E);
  42. msgpackWriter.WriteByte(0x7D);
  43. msgpackWriter.WriteFullEncode();
  44. //===========output=========
  45. //Unencode:
  46. //7E 7D 7E 7D
  47. //Encode
  48. //7D 02 7D 01 7D 02 7D 01
  49. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  50. Assert.Equal("7E 7D 7E 7D 7D 02 7D 01 7D 02 7D 01".Replace(" ", ""), realBytes);
  51. }
  52. [Fact]
  53. public void WriteDateTimeTest()
  54. {
  55. byte[] array = new byte[4096];
  56. var msgpackWriter = new JT808MessagePackWriter(array);
  57. msgpackWriter.WriteStart();
  58. msgpackWriter.WriteDateTime_YYYYMMDD(DateTime.Parse("2019-06-19 23:23:23"));
  59. msgpackWriter.WriteDateTime_HHmmssfff(DateTime.Parse("2019-06-19 23:23:23.123"));
  60. msgpackWriter.WriteDateTime_yyMMddHHmmss(DateTime.Parse("2019-06-19 23:23:23"));
  61. msgpackWriter.WriteEnd();
  62. msgpackWriter.WriteEncode();
  63. //===========output=========
  64. //WriteDateTime4=>YYYYMMDD=>20 19 06 19
  65. //WriteDateTime5=>HH-mm-ss-fff|HH-mm-ss-msms=>23 23 23 01 23
  66. //WriteDateTime6=>yyMMddHHmmss=>19 23 23 23
  67. //Unencode:
  68. //7E2019061923232312301906192323237E
  69. //Encode
  70. //7E 20 19 06 19 23 23 23 01 23 19 06 19 23 23 23 7E
  71. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  72. Assert.Equal("7E2019061923232301231906192323237E".Replace(" ", ""), encodeBytes);
  73. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  74. Assert.Equal("7E2019061923232301231906192323237E7E2019061923232301231906192323237E", realBytes);
  75. }
  76. [Fact]
  77. public void WriteDateTimeNullTest()
  78. {
  79. byte[] array = new byte[4096];
  80. var msgpackWriter = new JT808MessagePackWriter(array);
  81. msgpackWriter.WriteStart();
  82. msgpackWriter.WriteDateTime_YYYYMMDD(null);
  83. msgpackWriter.WriteDateTime_HHmmssfff(null);
  84. msgpackWriter.WriteDateTime_yyMMddHHmmss(null);
  85. msgpackWriter.WriteEnd();
  86. msgpackWriter.WriteEncode();
  87. //===========output=========
  88. //WriteDateTime4=>YYYYMMDD=>00 00 00 00
  89. //WriteDateTime5=>HH-mm-ss-fff|HH-mm-ss-msms=>00 00 00 00 00
  90. //WriteDateTime6=>yyMMddHHmmss=>00 00 00 00
  91. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  92. Assert.Equal("7E0000000000000000000000000000007E".Replace(" ", ""), encodeBytes);
  93. }
  94. [Fact]
  95. public void WriteUTCDateTimeTest()
  96. {
  97. byte[] array = new byte[4096];
  98. var msgpackWriter = new JT808MessagePackWriter(array);
  99. msgpackWriter.WriteUTCDateTime(DateTime.Parse("2019-06-21 23:23:23"));
  100. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  101. Assert.Equal("000000005D0CF66B", encodeBytes);
  102. }
  103. [Fact]
  104. public void WriteBCDTest1()
  105. {
  106. byte[] array = new byte[4096];
  107. var msgpackWriter = new JT808MessagePackWriter(array);
  108. msgpackWriter.WriteStart();
  109. msgpackWriter.WriteBCD("1234567890", 10);
  110. msgpackWriter.WriteEnd();
  111. msgpackWriter.WriteEncode();
  112. //7E 12 34 56 78 90 7E 7E 12 34 56 78 90 7E
  113. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  114. Assert.Equal("7E 12 34 56 78 90 7E 7E 12 34 56 78 90 7E".Replace(" ", ""), realBytes);
  115. }
  116. [Fact]
  117. public void WriteBCDTest2()
  118. {
  119. byte[] array = new byte[4096];
  120. var msgpackWriter = new JT808MessagePackWriter(array);
  121. msgpackWriter.WriteStart();
  122. msgpackWriter.WriteBCD("1234567890", 5);
  123. msgpackWriter.WriteEnd();
  124. msgpackWriter.WriteEncode();
  125. //7E 12 34 7E 7E 12 34 7E
  126. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  127. Assert.Equal("7E 12 34 7E 7E 12 34 7E".Replace(" ", ""), realBytes);
  128. }
  129. [Fact]
  130. public void WriteBCDTest3()
  131. {
  132. byte[] array = new byte[4096];
  133. var msgpackWriter = new JT808MessagePackWriter(array);
  134. msgpackWriter.WriteStart();
  135. msgpackWriter.WriteBCD("123", 5);
  136. msgpackWriter.WriteEnd();
  137. msgpackWriter.WriteEncode();
  138. //7E 00 12 7E 7E 00 12 7E
  139. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  140. Assert.Equal("7E 00 12 7E 7E 00 12 7E".Replace(" ", ""), realBytes);
  141. }
  142. [Theory]
  143. [InlineData("smallchi(Koike)")]
  144. public void WriteStringTest(string str)
  145. {
  146. byte[] array = new byte[4096];
  147. var msgpackWriter = new JT808MessagePackWriter(array);
  148. msgpackWriter.WriteStart();
  149. msgpackWriter.WriteString(str);
  150. msgpackWriter.WriteEnd();
  151. msgpackWriter.WriteEncode();
  152. byte[] strBytes = JT808Constants.Encoding.GetBytes(str);
  153. var strHex = strBytes.ToHexString();
  154. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  155. //7E736D616C6C636869284B6F696B65297E7E736D616C6C636869284B6F696B65297E
  156. Assert.StartsWith(strHex, realBytes.Substring(2));
  157. Assert.Equal("7E736D616C6C636869284B6F696B65297E7E736D616C6C636869284B6F696B65297E", realBytes);
  158. }
  159. [Theory]
  160. [InlineData("ABCDEF1234")]
  161. public void WriteHexTest(string hexStr)
  162. {
  163. byte[] array = new byte[4096];
  164. var msgpackWriter = new JT808MessagePackWriter(array);
  165. msgpackWriter.WriteStart();
  166. msgpackWriter.WriteHex(hexStr, 16);
  167. msgpackWriter.WriteEnd();
  168. msgpackWriter.WriteEncode();
  169. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  170. //7E0000000000000000000000ABCDEF12347E7E0000000000000000000000ABCDEF12347E
  171. Assert.StartsWith("0000000000000000000000ABCDEF1234", realBytes.Substring(2));
  172. Assert.Equal("7E0000000000000000000000ABCDEF12347E7E0000000000000000000000ABCDEF12347E", realBytes);
  173. }
  174. [Theory]
  175. [InlineData(new byte[] { 0x01, 0x02, 0x03 })]
  176. public void WriteArrayTest(byte[] dara)
  177. {
  178. byte[] array = new byte[4096];
  179. var msgpackWriter = new JT808MessagePackWriter(array);
  180. msgpackWriter.WriteStart();
  181. msgpackWriter.WriteArray(dara);
  182. msgpackWriter.WriteEnd();
  183. msgpackWriter.WriteEncode();
  184. //===========output=========
  185. //Unencode:
  186. //7E 01 02 03 7E
  187. //Encode
  188. //7E 01 02 03 7E
  189. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  190. Assert.Equal("7E 01 02 03 7E 7E 01 02 03 7E".Replace(" ",""), realBytes);
  191. }
  192. [Fact]
  193. public void WriteNumericalTest()
  194. {
  195. byte[] array = new byte[4096];
  196. var msgpackWriter = new JT808MessagePackWriter(array);
  197. msgpackWriter.WriteStart();
  198. msgpackWriter.WriteByte(0x01);
  199. msgpackWriter.WriteUInt16(16);
  200. msgpackWriter.WriteInt32(32);
  201. msgpackWriter.WriteUInt32(64);
  202. msgpackWriter.WriteEnd();
  203. msgpackWriter.WriteEncode();
  204. //===========output=========
  205. //Unencode:
  206. //7E 01 00 10 00 00 00 20 00 00 00 40 7E
  207. //Encode
  208. //7E 01 00 10 00 00 00 20 00 00 00 40 7E
  209. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  210. Assert.Equal("7E 01 00 10 00 00 00 20 00 00 00 40 7E 7E 01 00 10 00 00 00 20 00 00 00 40 7E".Replace(" ", ""), realBytes);
  211. }
  212. [Theory]
  213. [InlineData(5)]
  214. public void SkipTest(int count)
  215. {
  216. byte[] array = new byte[4096];
  217. var msgpackWriter = new JT808MessagePackWriter(array);
  218. msgpackWriter.WriteStart();
  219. msgpackWriter.Skip(count, out int position);
  220. msgpackWriter.WriteEnd();
  221. msgpackWriter.WriteEncode();
  222. //===========output=========
  223. //Unencode:
  224. //7E 00 00 00 00 00 7E
  225. //Encode
  226. //7E 00 00 00 00 00 7E
  227. Assert.Equal(1, position);
  228. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  229. Assert.Equal("7E 00 00 00 00 00 7E 7E 00 00 00 00 00 7E".Replace(" ",""), realBytes);
  230. }
  231. [Theory]
  232. [InlineData(5,0xFF)]
  233. public void CustomSkipTest(int count,byte fullValue)
  234. {
  235. byte[] array = new byte[4096];
  236. var msgpackWriter = new JT808MessagePackWriter(array);
  237. msgpackWriter.WriteStart();
  238. msgpackWriter.Skip(count, out int position, fullValue);
  239. msgpackWriter.WriteEnd();
  240. msgpackWriter.WriteEncode();
  241. //===========output=========
  242. //Unencode:
  243. //7E FF FF FF FF FF 7E
  244. //Encode
  245. //7E FF FF FF FF FF 7E
  246. Assert.Equal(1, position);
  247. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  248. Assert.Equal("7E FF FF FF FF FF 7E 7E FF FF FF FF FF 7E".Replace(" ", ""), realBytes);
  249. }
  250. [Fact]
  251. public void NilTest()
  252. {
  253. byte[] array = new byte[4096];
  254. var msgpackWriter = new JT808MessagePackWriter(array);
  255. msgpackWriter.WriteStart();
  256. msgpackWriter.Nil(out int position);
  257. msgpackWriter.WriteEnd();
  258. msgpackWriter.WriteEncode();
  259. Assert.Equal(1, position);
  260. //===========output=========
  261. //Unencode:
  262. //7E 00 7E
  263. //Encode
  264. //7E 00 7E
  265. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  266. Assert.Equal("7E 00 7E 7E 00 7E".Replace(" ", ""), realBytes);
  267. }
  268. [Theory]
  269. [InlineData(1, 12)]
  270. public void WriteXorTest1(int start,int end)
  271. {
  272. byte[] array = new byte[4096];
  273. var msgpackWriter = new JT808MessagePackWriter(array);
  274. msgpackWriter.WriteStart();
  275. msgpackWriter.WriteArray("02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01".ToHexBytes());
  276. msgpackWriter.WriteXor(start, end);
  277. msgpackWriter.WriteEnd();
  278. msgpackWriter.WriteEncode();
  279. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  280. Assert.NotEqual("13", realBytes.Substring(realBytes.Length-4, 2));
  281. }
  282. [Theory]
  283. [InlineData(12, 1)]
  284. public void WriteXorTest2(int start, int end)
  285. {
  286. Assert.Throws<ArgumentOutOfRangeException>(() =>
  287. {
  288. byte[] array = new byte[4096];
  289. var msgpackWriter = new JT808MessagePackWriter(array);
  290. msgpackWriter.WriteStart();
  291. msgpackWriter.WriteXor(start, end);
  292. msgpackWriter.WriteEnd();
  293. msgpackWriter.WriteEncode();
  294. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  295. });
  296. }
  297. [Fact]
  298. public void WriteXorTest3()
  299. {
  300. byte[] array = new byte[4096];
  301. var msgpackWriter = new JT808MessagePackWriter(array);
  302. msgpackWriter.WriteStart();
  303. msgpackWriter.WriteArray("02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01".ToHexBytes());
  304. msgpackWriter.WriteXor();
  305. msgpackWriter.WriteEnd();
  306. msgpackWriter.WriteEncode();
  307. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  308. Assert.Equal("13", realBytes.Substring(realBytes.Length - 4, 2));
  309. }
  310. [Theory]
  311. [InlineData(1,0x02,
  312. 2,8,
  313. 4,9,
  314. 6,"654321",
  315. 3,new byte[] { 0x01,0x02,0x03})]
  316. public void WriteReturnTest(
  317. int skipbyte, byte writeNewByte,
  318. int skipInt16, ushort writeNewInt16,
  319. int skipInt32, int writeNewInt32,
  320. int skipString, string writeNewString,
  321. int skipArray3, byte[] writeNewArray)
  322. {
  323. byte[] array = new byte[4096];
  324. var msgpackWriter = new JT808MessagePackWriter(array);
  325. msgpackWriter.WriteStart();
  326. msgpackWriter.Skip(skipbyte, out var position1);
  327. msgpackWriter.Skip(skipInt16, out var position2);
  328. msgpackWriter.Skip(skipInt32, out var position3);
  329. msgpackWriter.Skip(skipString, out var position4);
  330. msgpackWriter.Skip(skipArray3, out var position5);
  331. msgpackWriter.WriteEnd();
  332. msgpackWriter.WriteEncode();
  333. //===========skip output=========
  334. //Unencode:
  335. //7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E
  336. //Encode
  337. //7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E
  338. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  339. Assert.Equal("7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E".Replace(" ", ""), realBytes);
  340. msgpackWriter.WriteByteReturn(writeNewByte, position1);
  341. msgpackWriter.WriteUInt16Return(writeNewInt16, position2);
  342. msgpackWriter.WriteInt32Return(writeNewInt32, position3);
  343. msgpackWriter.WriteBCDReturn(writeNewString, skipString, position4);
  344. msgpackWriter.WriteArrayReturn(writeNewArray, position5);
  345. //===========write return output=========
  346. //7E 02 00 08 00 00 00 09 65 43 21 00 00 00 01 02 03 7E
  347. var writeRealBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  348. Assert.Equal("7E 02 00 08 00 00 00 09 65 43 21 00 00 00 01 02 03 7E 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E".Replace(" ", ""), writeRealBytes);
  349. }
  350. [Fact]
  351. public void WriteUInt64Test()
  352. {
  353. byte[] array = new byte[4096];
  354. var msgpackWriter = new JT808MessagePackWriter(array);
  355. msgpackWriter.WriteUInt64(1008611);
  356. var hex = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  357. //00 00 00 00 00 0F 63 E3
  358. Assert.Equal("00 00 00 00 00 0F 63 E3".Replace(" ", ""), hex);
  359. }
  360. [Theory]
  361. [InlineData("123456789")]
  362. public void WriteBigNumberTest(string numStr)
  363. {
  364. byte[] array = new byte[4096];
  365. var msgpackWriter = new JT808MessagePackWriter(array);
  366. msgpackWriter.WriteBigNumber(numStr, numStr.Length);
  367. var hex = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  368. Assert.Equal("0000000000075BCD15", hex);
  369. }
  370. [Theory]
  371. [InlineData(100000)]
  372. //[InlineData(1000000)]
  373. //[InlineData(10000000)]
  374. //[InlineData(100000000)]
  375. public void ArrayPoolTest1(int count)
  376. {
  377. var arrayPool = ArrayPool<byte>.Create();
  378. while (count>=0)
  379. {
  380. var buffer = arrayPool.Rent(65535);
  381. var msgpackWriter = new JT808MessagePackWriter(buffer);
  382. try
  383. {
  384. msgpackWriter.WriteStart();
  385. msgpackWriter.WriteInt32(16);
  386. msgpackWriter.WriteEnd();
  387. msgpackWriter.WriteEncode();
  388. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  389. Assert.Equal("7E 00 00 00 10 7E 7E 00 00 00 10 7E".Replace(" ", ""), realBytes);
  390. }
  391. catch (Exception)
  392. {
  393. }
  394. finally
  395. {
  396. arrayPool.Return(buffer);
  397. count--;
  398. }
  399. }
  400. }
  401. [Fact]
  402. public void WriteASCII()
  403. {
  404. byte[] array = new byte[4096];
  405. byte[] array1 = new byte[] { 0x53,0x56,0x31,0x2E,0x31,0x2E,0x30 };
  406. var msgpackWriter = new JT808MessagePackWriter(array);
  407. msgpackWriter.WriteASCII("SV1.1.0");
  408. var writeRealBytes = msgpackWriter.FlushAndGetRealArray();
  409. Assert.Equal(array1, writeRealBytes);
  410. }
  411. [Fact]
  412. public void CompositeTest1()
  413. {
  414. byte[] array = new byte[4096];
  415. var msgpackWriter = new JT808MessagePackWriter(array);
  416. msgpackWriter.WriteStart();
  417. msgpackWriter.WriteByte(0x01);
  418. msgpackWriter.WriteByte(0x7E);
  419. msgpackWriter.WriteByte(0x7d);
  420. msgpackWriter.WriteEnd();
  421. msgpackWriter.WriteEncode();
  422. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  423. Assert.Equal("7E017D027D017E", encodeBytes);
  424. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  425. Assert.Equal("7E017E7D7E7E017D027D017E", realBytes);
  426. }
  427. [Fact]
  428. public void CompositeTest2()
  429. {
  430. byte[] array = new byte[4096];
  431. var msgpackWriter = new JT808MessagePackWriter(array);
  432. msgpackWriter.WriteStart();
  433. msgpackWriter.WriteByte(0x01);
  434. msgpackWriter.WriteByte(0x7E);
  435. msgpackWriter.Nil(out int nilPosition);
  436. Assert.Equal(3, nilPosition);
  437. msgpackWriter.WriteByte(0x7d);
  438. msgpackWriter.WriteBCD("123456789", 10);
  439. msgpackWriter.Skip(5, out int skipPostion);
  440. Assert.Equal(10, skipPostion);
  441. msgpackWriter.WriteEnd();
  442. msgpackWriter.WriteEncode();
  443. //===========output=========
  444. //Unencode:
  445. //7E 01 7E 00 7D 01 23 45 67 89 00 00 00 00 00 7E
  446. //Encode
  447. //7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E
  448. //7E 01 7D 02 00 7D 01 01 00 23 00 45 00 00 00 00 00 7E
  449. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  450. Assert.Equal("7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E".Replace(" ", ""), encodeBytes);
  451. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  452. Assert.Equal("7E 01 7E 00 7D 01 23 45 67 89 00 00 00 00 00 7E 7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E".Replace(" ", ""), realBytes);
  453. }
  454. [Fact]
  455. public void VersionTest1()
  456. {
  457. byte[] array = new byte[4096];
  458. var msgpackWriter = new JT808MessagePackWriter(array);
  459. Assert.Equal(JT808Version.JTT2013, msgpackWriter.Version);
  460. msgpackWriter.Version = JT808Version.JTT2019;
  461. Assert.Equal(JT808Version.JTT2019, msgpackWriter.Version);
  462. }
  463. [Fact]
  464. public void WriteInt16Test1()
  465. {
  466. byte[] array1 = new byte[2];
  467. byte[] array2= new byte[2];
  468. BinaryPrimitives.WriteInt16BigEndian(array1, -1233);
  469. short a = -1233;
  470. BinaryPrimitives.WriteUInt16BigEndian(array2, (ushort)a);
  471. Assert.Equal(array1, array2);
  472. }
  473. [Fact]
  474. public void WriteStringEndChar0Test()
  475. {
  476. byte[] array = new byte[22];
  477. var msgpackWriter = new JT808MessagePackWriter(array);
  478. msgpackWriter.WriteStringEndChar0("smallchi(koike)");
  479. var hex = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  480. Assert.Equal("736D616C6C636869286B6F696B652900", hex);
  481. }
  482. [Fact]
  483. public void IntToBcdTest()
  484. {
  485. var bytes1 = new byte[5];
  486. Span<byte> buffer1 = new Span<byte>(bytes1);
  487. IntToBcd(123456700, buffer1, buffer1.Length);
  488. Assert.NotEqual(new byte[] { 0x12, 0x34, 0x56, 0x70,0x00 }, buffer1.ToArray());
  489. Assert.Equal(new byte[] { 0x01, 0x23, 0x45, 0x67,0x00 }, buffer1.ToArray());
  490. var bytes = new byte[6];
  491. Span<byte> buffer = new Span<byte>(bytes);
  492. IntToBcd(123456700, buffer, buffer.Length);
  493. Assert.Equal(new byte[] { 0x00, 0x01, 0x23, 0x45, 0x67, 0x00 }, buffer.ToArray());
  494. }
  495. [Fact]
  496. public void WriteBcdTest()
  497. {
  498. byte[] array = new byte[100];
  499. var msgpackWriter = new JT808MessagePackWriter(array);
  500. int val1 = 1234567890;
  501. long val2 = 123456789011;
  502. msgpackWriter.WriteBCD(val1, 5);
  503. msgpackWriter.WriteBCD(val2, 10);
  504. var result = msgpackWriter.FlushAndGetRealArray();
  505. Assert.Equal(new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x90, 0x11 }, result);
  506. }
  507. private void IntToBcd(int num, Span<byte> list, int count)
  508. {
  509. int level = count - 1;
  510. var high = num / 100;
  511. var low = num % 100;
  512. if (high > 0)
  513. {
  514. IntToBcd(high, list, --count);
  515. }
  516. byte res = (byte)(((low / 10) << 4) + (low % 10));
  517. list[level] = res;
  518. }
  519. }
  520. }