(C#) Как заставить форматирование HexDump работать с TextBox?

У меня есть TextBox на формах Windows, где я успешно получаю hex-данные с com-порта, но они отображаются в строке, а мне нужно, чтобы они отображались в HexDumpFormat.

Что я получаю сейчас:

Что я получаю сейчас

После поиска я нашел пример кода: Quick дамп Dirty Hex. Вроде это то, что мне нужно, ТС сказал, что все, что нам нужно, это вставить его функцию в мой код, и вызвать эту функцию там, где нам нужно, но я озадачен, как именно заставить ее работать с моим кодом? Большое спасибо. (Я не могу прикрепить более 3-х ссылок, поэтому вы можете увидеть на странице ссылок, как выглядит формат HexDump.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }

        string rs;
        byte re;
        private void serialPort1_DataReceived(object sender,    SerialDataReceivedEventArgs e) // Da
        {
            try
            {
                //rs = serialPort1.ReadByte();
                //re = Convert.ToByte(serialPort1.ReadByte());
                rs = serialPort1.ReadExisting();
                System.Text.Encoding.ASCII.GetString(new[] { re });
                this.Invoke(new EventHandler(type));
            }
            catch (System.TimeoutException) { }
        }
        void type(object s, EventArgs e)              // receive data
        {
            textBox4.Text += rs;
        }
    }
}

person Jeezy Wonder    schedule 10.02.2017    source источник
comment
Вы хотите, чтобы результат был точно таким же, как в ссылке? сначала с двоичным значением, а затем с шестнадцатеричным представлением, разделенным пробелом?   -  person Mong Zhu    schedule 10.02.2017
comment
На самом деле это не так важно, спасибо за ответ.   -  person Jeezy Wonder    schedule 10.02.2017
comment
С бинарником было бы лучше, но сейчас я сильно запутался, так что даже без бинарника не обойтись...   -  person Jeezy Wonder    schedule 10.02.2017
comment
шестнадцатеричные числа отправляются в виде строки? это выглядит так: rs = "0004" ?   -  person Mong Zhu    schedule 10.02.2017
comment
На самом деле я отправляю с микроконтроллера, где код работает с 16-битным двоичным кодом, но я настроил, что MK будет выводить данные на com-порт не в двоичном формате, а в .hex. В любом случае, я могу настроить его снова и отправить как есть - в двоичном виде это будет выглядеть как 00000000000000001 за 1, если это сделает вещи проще.   -  person Jeezy Wonder    schedule 10.02.2017
comment
Я сомневаюсь, что это будет проще, если он будет двоичным. Вы смогли прочитать его байт за байтом?   -  person Mong Zhu    schedule 10.02.2017
comment
и я запутался с вашим вопросом, разве 0004 - шестнадцатеричные данные? (16 бит)?   -  person Jeezy Wonder    schedule 10.02.2017
comment
да, он отправляет как есть в 16-битном значении 00000000000000001   -  person Jeezy Wonder    schedule 10.02.2017
comment
это так, но имеет значение, получаете ли вы эту информацию как байт b = 0x00 или как строку s = 00, потому что в строке каждый символ представлен байтом!   -  person Mong Zhu    schedule 10.02.2017
comment
поэтому эта строка s = 00 приведет к 2 байтам. Первый — 0x48, а второй — 0x48. посмотрите здесь   -  person Mong Zhu    schedule 10.02.2017


Ответы (1)


Пробовал код по ссылке. Этот простой пример:

byte[] byte_array = new byte[5];

byte_array[0] = 0xAC;
byte_array[1] = 0x12;
byte_array[2] = 0xA0;
byte_array[3] = 0xC5;
byte_array[4] = 0x88;

Console.WriteLine(Utils.HexDump(byte_array, byte_array.Length));

приводит к следующему результату:

введите здесь описание изображения

Важно то, что вы указываете, сколько байтов из массива должно быть напечатано в 1 строке.

Вам нужно получить данные из SerialPort в массив байтов. Я бы предложил попробовать следующий код:

SerialPort serialPort1 = new SerialPort();

byte[] byte_array = new byte[1024];
int counter = 0;

while (serialPort1.BytesToRead > 0)
{
    byte_array[counter] = (byte)serialPort1.ReadByte();
    counter++;
}

ИЗМЕНИТЬ

чтобы иметь возможность использовать код из ссылки, добавьте в проект новый файл класса. И скопируйте в него код. Убедитесь, что файл класса *.cs находится в том же проекте, что и ваш класс Form1.

РЕДАКТИРОВАТЬ 2:

Если вы получаете шестнадцатеричные числа в виде строки. вы можете просто преобразовать его самостоятельно в массив байтов, а затем использовать класс Utils из вашей ссылки для его отображения. Вот небольшой пример кода для этого:

string rs = "0004";   // example from your code

byte[] byte_array = new byte[rs.Length/2]; // array is half as long as your string
int idx = 0; // count variable to index the string
int cnt = 0; // count variable to index the byte array

while (idx < rs.Length-1)
{
    byte_array[cnt] = (byte)Convert.ToInt32(rs.Substring(idx, 2), 16);
    idx += 2;
    cnt++;
}

Затем вы можете распечатать результат следующим образом:

textBox4.Text += Utils.HexDump(byte_array, cnt) + Environment.NewLine; 
person Mong Zhu    schedule 10.02.2017
comment
Большое спасибо, приятель, но как напечатать результат в textBox4? - person Jeezy Wonder; 10.02.2017
comment
Я попробовал textBox4.Text = (Utils.HexDump(buffer)); но не работает - person Jeezy Wonder; 10.02.2017
comment
я получил ошибку, что Utils и буфер не существуют в этом контексте - person Jeezy Wonder; 10.02.2017
comment
void type(object s, EventArgs e) { textBox4.Text = (Utils.HexDump(buffer)); } - person Jeezy Wonder; 10.02.2017
comment
вы видели мой второй пример? Вам нужно объявить byte[] в вашем коде. До сих пор я не вижу ни одного. и вам нужно создать новый файл *.cs и скопировать туда код класса Utils. Убедитесь, что он находится в том же проекте, что и ваш класс Form1. - person Mong Zhu; 10.02.2017
comment
@JeezyWonder Я сделал второе редактирование с небольшим примером кода, чтобы использовать входящую строку и преобразовать ее в массив байтов. чтобы вы могли распечатать его в своем текстовом поле. Посмотрите и попробуйте. Надеюсь, поможет - person Mong Zhu; 10.02.2017
comment
Вопрос о втором редактировании. Как я понял, мне нужно преобразовать все шестнадцатеричные значения самостоятельно в проекте? Или только один, чтобы заставить его работать со всеми, как с кулаком? Я попробую ваш код и опубликую результат, большое спасибо за помощь, Монг - person Jeezy Wonder; 10.02.2017
comment
Вы должны понимать, что если вы хотите использовать метод Utils.HexDump, вам нужно иметь данные в массиве байтов. Итак, вам нужно преобразовать строковое представление, которое вы получаете через последовательный порт, в байтовое представление. Для этого вы можете использовать второе редактирование. Добро пожаловать. Если мой ответ помог вам, вы можете отметить его как принятый. - person Mong Zhu; 10.02.2017