| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | using System;using System.Collections.Generic;using System.Globalization;using System.Text;namespace Renci.SshNet.Common{    internal static class PacketDump    {        public static string Create(List<byte> data, int indentLevel)        {            return Create(data.ToArray(), indentLevel);        }        public static string Create(byte[] data, int indentLevel)        {            if (data is null)            {                throw new ArgumentNullException(nameof(data));            }            if (indentLevel < 0)            {                throw new ArgumentOutOfRangeException(nameof(indentLevel), "Cannot be less than zero.");            }            const int lineWidth = 16;            var result = new StringBuilder();            var line = new byte[lineWidth];            var indentChars = new string(' ', indentLevel);            for (var pos = 0; pos < data.Length;)            {                var linePos = 0;                if (result.Length > 0)                {                    _ = result.Append(Environment.NewLine);                }                _ = result.Append(indentChars);                _ = result.Append(pos.ToString("X8"));                _ = result.Append("  ");                while (true)                {                    line[linePos++] = data[pos++];                    if (linePos == lineWidth || pos == data.Length)                    {                        break;                    }                }                _ = result.Append(AsHex(line, linePos));                _ = result.Append("  ");                _ = result.Append(AsAscii(line, linePos));            }            return result.ToString();        }        private static string AsHex(byte[] data, int length)        {            var hex = new StringBuilder();            for (var i = 0; i < length; i++)            {                if (i > 0)                {                    _ = hex.Append(' ');                }                _ = hex.Append(data[i].ToString("X2", CultureInfo.InvariantCulture));            }            if (length < data.Length)            {                _ = hex.Append(new string(' ', (data.Length - length) * 3));            }            return hex.ToString();        }        private static string AsAscii(byte[] data, int length)        {            var encoding = Encoding.ASCII;            var ascii = new StringBuilder();            const char dot = '.';            for (var i = 0; i < length; i++)            {                var b = data[i];                if (b is < 32 or >= 127)                {                    _ = ascii.Append(dot);                }                else                {                    _ = ascii.Append(encoding.GetString(data, i, 1));                }            }            return ascii.ToString();        }    }}
 |