Как прочитать шестнадцатеричные числа из консоли в массив байтов и затем вывести их?
Ввожу шестнадцатеричное число к примеру: 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 шт):
Подход не совсем правильный. Метод
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.