Как прочитать шестнадцатеричные числа из консоли в массив байтов и затем вывести их?

Ввожу шестнадцатеричное число к примеру: 0xA1 0x02 и хочу вывести их в консоль.

Но увы не выходит :-(

Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

struct Message
{    
    public byte[] setMessage; 
}

class TrimTram1
{
    public static void Main() 
        {
            Console.WriteLine("Тестовая прога.");
            // передача данных в структуру
            Message message = new Message();
            message.setMessage = System.Text.Encoding.UTF8.GetBytes(Console.ReadLine());
            Console.WriteLine("{0}", message.setMessage.toString);
        }
}

Вот вывод:

mono tehn1_old.exe 
Тестовая прога.
0xA10x01
System.Byte[]

Нужно вместо System.Byte[] вывести введенные числа в таком же формате.

Прочел книгу c# and game programming a beginner's guide Но увы там вообще с с массивом байтов не работают :( так и не понял почему.


Ответы (1 шт):

Автор решения: default locale

Подход не совсем правильный. Метод

Console.ReadLine

считывает не байты, а строку из восьми символов: 0xA10x01. Соответственно, код:

UTF8.GetBytes(Console.ReadLine());

преобразовывает строку в байтовое представление в кодировке UTF-8. А именно, он берет каждый символ введенной строки («0», «x», «A», «1» и т.д.) и преобразует каждый из них в один или несколько байтов.

У Вас, насколько я понял, задача другая:

  • Нужно принять от пользователя несколько байтов в виде строк в шестнадцатеричном представлении.
  • Преобразовать эти строки в массив байтов.
  • Вывести массив байтов в таком же виде.

Стандартного способа сразу читать байты в таком представлении из консоли я не нашел. Поэтому строку понадобится парсить самому. Можно для этого написать два дополнительных метода: для преобразования строки в массив байтов и наоборот.

Формат предлагаю оставить таким же, только добавить пробелы для разделения символов:

class TrimTram1
{
    private static void Main()
    {
        Console.WriteLine("Тестовая прога.");
        //преобразовываем введенную строку в байты
        var message = new Message {setMessage = StringToByteArray(Console.ReadLine())};
        //преобразовываем байты в строку
        Console.WriteLine(ByteArrayToString(message.setMessage));
    }

    private static byte[] StringToByteArray(string hex)
    {
        return hex.Split().Select(s => Convert.ToByte(s.Replace("0x", ""), 16)).ToArray();
    }

    private static string ByteArrayToString(byte[] arr)
    {
        return string.Join(" ", arr.Select(b => $"0x{b:X2}"));
    }
}

Если вводить байты через пробел, то на входе и выходе получатся такие же значения.

По коду видно, что преобразование строки в байт выполняется через Convert.ToByte. Байт же в строку преобразуется с помощью спецификатора X.

Код написан на основе: How do you convert a byte array to a hexadecimal string, and vice versa?

P.S. Формат ввода можно улучшить. Например, избавиться от лишних 0x и вводить байты одной строкой A101. Тогда из кода можно будет убрать лишние Split и Replace.

→ Ссылка