Преобразование между байтовыми массивами и шестнадцатеричными строками в C#
В этом примере используются методы расширения для преобразования между байтовыми массивами и шестнадцатеричными строками. Он добавляет метод расширения ToHex в тип byte [] и метод расширения ToBytes в класс string. р>
Чтобы создать метод расширения, создайте открытый статический класс. Дайте ему методы, где объявление первого параметра начинается с ключевого слова this. Этот тип параметра определяет класс, к которому применяется метод.
В следующем коде показан метод расширения byte [] типа ToHex. Обратите внимание, как первый параметр имеет ключевое слово this и имеет тип byte [].
// Возвращает строку, представляющую массив байтов // как разделение шестнадцатеричных значений // символом разделителя. public static string ToHex(this byte[] the_bytes, char separator) { return BitConverter.ToString( the_bytes, 0).Replace('-', separator); }
Этот метод вызывает BitConverter.ToString, чтобы преобразовать массив байтов в строку, содержащую шестизначные шестнадцатеричные значения в формате 54-00-6F-00-20. В коде используется метод string класса Replace для замены дефиса на нужный разделительный символ.
К сожалению, класс BitConverter не имеет обратного метода, который преобразует строку формы 54-00-6F-00-20 обратно в a байт, поэтому вам нужно написать свой собственный. К счастью, это не сложно. В следующем коде показан способ расширения string класса ToBytes.
// Преобразование строки, содержащей 2-значный шестнадцатеричный // значения в массив байтов. public static byte[] ToBytes(this string the_string) { // Получить символ разделителя. char separator = the_string[2]; // Разделить на разделители. string[] pairs = the_string.Split(separator); byte[] bytes = new byte[pairs.Length]; for (int i = 0; i < pairs.Length; i++) bytes[i] = Convert.ToByte(pairs[i], 16); return bytes; }
Этот метод предполагает, что строка состоит из двухзначных шестнадцатеричных значений, разделенных символом разделителя. Он использует третий символ строки в качестве разделителя. Затем он использует метод string класса Split для разделения строки в разделителях.
Затем код перебирает шестнадцатеричные значения, использует Convert.ToByte для преобразования каждого обратно в значение byte и сохраняет результаты в bytes . Когда он заканчивается, метод возвращает этот массив.
При нажатии левой кнопки & gt; , программа использует следующий код для преобразования строки в шестнадцатеричное представление.
// Преобразуем строку в массив байтов и отобразим ее. private void btnToHexString_Click(object sender, EventArgs e) { // Преобразуем строку в байты. UnicodeEncoding ascii_encoder = new UnicodeEncoding(); byte[] bytes = ascii_encoder.GetBytes(txtOriginal.Text); // Отображение результата как строки шестнадцатеричных значений. txtHexadecimal.Text = bytes.ToHex(' '); }
Этот код использует объект System.Text.UnicodeEncoding для преобразования строки в массив byte. Затем он использует метод расширения ToHex для преобразования массива в строку и отображает результат.
При нажатии правой кнопки & gt; , программа использует следующий код для преобразования шестнадцатеричного представления обратно в строку.
// Преобразуем строку шестнадцатеричных значений обратно в строку. private void btnToString_Click(object sender, EventArgs e) { // Преобразование строки шестнадцатеричных значений // в массив байтов. byte[] bytes = txtHexadecimal.Text.ToBytes(); // Преобразование байтов в строку и отображение результата. UnicodeEncoding ascii_encoder = new UnicodeEncoding(); txtConvertedBack.Text = ascii_encoder.GetString(bytes); }