PacketDump.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Text;
  5. namespace Renci.SshNet.Common
  6. {
  7. internal static class PacketDump
  8. {
  9. public static string Create(List<byte> data, int indentLevel)
  10. {
  11. return Create(data.ToArray(), indentLevel);
  12. }
  13. public static string Create(byte[] data, int indentLevel)
  14. {
  15. if (data is null)
  16. {
  17. throw new ArgumentNullException(nameof(data));
  18. }
  19. if (indentLevel < 0)
  20. {
  21. throw new ArgumentOutOfRangeException(nameof(indentLevel), "Cannot be less than zero.");
  22. }
  23. const int lineWidth = 16;
  24. var result = new StringBuilder();
  25. var line = new byte[lineWidth];
  26. var indentChars = new string(' ', indentLevel);
  27. for (var pos = 0; pos < data.Length;)
  28. {
  29. var linePos = 0;
  30. if (result.Length > 0)
  31. {
  32. _ = result.Append(Environment.NewLine);
  33. }
  34. _ = result.Append(indentChars);
  35. _ = result.Append(pos.ToString("X8"));
  36. _ = result.Append(" ");
  37. while (true)
  38. {
  39. line[linePos++] = data[pos++];
  40. if (linePos == lineWidth || pos == data.Length)
  41. {
  42. break;
  43. }
  44. }
  45. _ = result.Append(AsHex(line, linePos));
  46. _ = result.Append(" ");
  47. _ = result.Append(AsAscii(line, linePos));
  48. }
  49. return result.ToString();
  50. }
  51. private static string AsHex(byte[] data, int length)
  52. {
  53. var hex = new StringBuilder();
  54. for (var i = 0; i < length; i++)
  55. {
  56. if (i > 0)
  57. {
  58. _ = hex.Append(' ');
  59. }
  60. _ = hex.Append(data[i].ToString("X2", CultureInfo.InvariantCulture));
  61. }
  62. if (length < data.Length)
  63. {
  64. _ = hex.Append(new string(' ', (data.Length - length) * 3));
  65. }
  66. return hex.ToString();
  67. }
  68. private static string AsAscii(byte[] data, int length)
  69. {
  70. var encoding = Encoding.ASCII;
  71. var ascii = new StringBuilder();
  72. const char dot = '.';
  73. for (var i = 0; i < length; i++)
  74. {
  75. var b = data[i];
  76. if (b is < 32 or >= 127)
  77. {
  78. _ = ascii.Append(dot);
  79. }
  80. else
  81. {
  82. _ = ascii.Append(encoding.GetString(data, i, 1));
  83. }
  84. }
  85. return ascii.ToString();
  86. }
  87. }
  88. }