HpeResolveUtil.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using Ips.Eph;
  6. using Ips.Library.Entity;
  7. namespace Ips.Eph.ResolveUtil
  8. {
  9. public static class HpeResolveUtil
  10. {
  11. const int MinColCount = 92;
  12. public static EphResult Parse(Span<char> line, int satid = 0)
  13. {
  14. int i = 0;
  15. var year = int.Parse(line.Slice(i, 5));
  16. i += 5;
  17. var month = int.Parse(line.Slice(i, 4));
  18. i += 4;
  19. var day = int.Parse(line.Slice(i, 4));
  20. i += 4;
  21. var hour = int.Parse(line.Slice(i, 4));
  22. i += 4;
  23. var minute = int.Parse(line.Slice(i, 4));
  24. i += 4;
  25. var second = float.Parse(line.Slice(i, 10));
  26. i += 10;
  27. var x = double.Parse(line.Slice(i, 20));
  28. i += 20;
  29. var y = double.Parse(line.Slice(i, 20));
  30. i += 20;
  31. var z = double.Parse(line.Slice(i, 20));
  32. i += 20;
  33. var vx = double.Parse(line.Slice(i, 20));
  34. i += 20;
  35. var vy = double.Parse(line.Slice(i, 20));
  36. i += 20;
  37. var vz = double.Parse(line.Slice(i, 20));
  38. var time = new DateTime(year, month, day, hour, minute, (int)second, DateTimeKind.Local).AddHours(8);
  39. var result = new EphResult(satid, time.ToLocalTime(), x, y, z, vx, vy, vz);
  40. return result;
  41. }
  42. public static EphResult Parse(char[] line, int satid = 0)
  43. {
  44. Span<char> chars = new Span<char>(line);
  45. return Parse(chars, satid);
  46. }
  47. public static EphResult Parse(string line, int satid = 0)
  48. {
  49. Span<char> chars = new Span<char>(line.ToCharArray());
  50. return Parse(chars, satid);
  51. }
  52. public static IEnumerable<EphResult> ParseFile(string filename, int satid = 0)
  53. {
  54. using (var reader = new StreamReader(filename))
  55. {
  56. Span<char> startLine = stackalloc char[300];
  57. reader.ReadBlock(startLine);
  58. var colCount = startLine.IndexOf('\n') + 1;
  59. if (colCount < MinColCount)
  60. yield break;
  61. reader.BaseStream.Seek(0, SeekOrigin.Begin);
  62. reader.DiscardBufferedData();
  63. var readLen = 0;
  64. while (!reader.EndOfStream)
  65. {
  66. Span<char> line = stackalloc char[colCount];
  67. readLen = reader.ReadBlock(line);
  68. if (readLen != colCount) continue;
  69. yield return Parse(line, satid);
  70. }
  71. }
  72. yield break;
  73. }
  74. }
  75. }