Потеря символов при преобразовании байтового массива в шестнадцатеричный - PullRequest
0 голосов
/ 06 ноября 2019

Я хотел преобразовать случайный байтовый массив в шестнадцатеричный, ошибки нет, но позвольте мне показать вывод:

Первый вывод в качестве примера: D2C13E9C4C9378C7

И второй, который долженто же самое с пробелами: D2 C1 3 9C 4C 93 78 C7 <- он только что удалил E после 3, кто-нибудь знает почему? </p>

        static void Main(string[] args)
        {
            // with string interpolation
            Random rnd = new Random();
            byte[] bytes = new byte[8];
            rnd.NextBytes(bytes);
            long l = BitConverter.ToInt64(bytes, 0);
            Console.WriteLine($"Without To Hex Method: {l:X}");
            string hexstring = ToHex(bytes);
            Console.WriteLine($"With To Hex Method: {hexstring}");


            Console.ReadKey();
        }

        public static string ToHex(byte[] arr)
        {
            StringBuilder sb = new StringBuilder();

            var arr1 = arr.Reverse().ToArray();

            for (int i = 0; i < arr1.Length; i++)
            {
                sb.Append($"{arr1[i]:X2} ");
            }

            sb.Remove(arr.Length - 1, 1);

            return sb.ToString();
        }

1 Ответ

0 голосов
/ 06 ноября 2019

Проблема с sb.Remove(arr.Length - 1, 1): arr.Length не sb.Length, потому что символы имеют размер 2 байта, поэтому вы потеряли некоторый символ в середине левой половины.

Вы можете использовать это:

static public string ToHex(byte[] array)
{
  var builder = new StringBuilder();
  array = array.Reverse().ToArray();
  for ( int index = 0; index < array.Length; index++ )
  {
    builder.Append($"{array[i]:X2} ");
  }
  return builder.ToString().TrimEnd();
}

Но изменение массива бесполезно и потеря скорости и памяти, так как вы можете уменьшить цикл:

static public string ToHex(byte[] array)
{
  var builder = new StringBuilder();
  for ( int index = array.Length - 1; index >= 0; index-- )
  {
    builder.Append($"{array[i]:X2} ");
  }
  return builder.ToString().TrimEnd();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...