Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > C# преобразование пакета


Автор: hitman2010 8.4.2011, 19:26
Есть TCP пакет типа такого

Код

45 00 00 28 1D FA 40 00 80 06 22 17 C0 A8 00 65  E..(.ú@.€.".À¨.e
3E 92 BB 1F 10 6A 00 50 74 04 75 B7 3E E4 32 A3  >’»..j.Pt.u·>ä2£
50 11 0F FC 79 1B 00 00                          P..üy...


как из этого пакета получить строку "E..(.ú@.€.".À¨.e>’»..j.Pt.u·>ä2£P..üy..." ?

Автор: Экскалупатор 9.4.2011, 01:06
http://ascii.org.ru/

конвертируй в int, а потом в каждый int в char

Автор: dextermd 9.4.2011, 01:08
На входе имеем массив чисел в шестнадцатеричном формате (hex), на выходе нужно получить строку символов ascii. Для выполнения задачи нужно проделать два шага: преобразовать числа входного массива из hex в byte, а затем из byte получить символы ascii.

Код

string input = "45 00 00 28 1D FA 40 00 80 06 22 17 C0 A8 00 65 " +
               "3E 92 BB 1F 10 6A 00 50 74 04 75 B7 3E E4 32 A3 " +
               "50 11 0F FC 79 1B 00 00 ";
Byte[] table = new Byte[input.Length / 3];
for (int i = 0, k = 0; i < table.Length; i++, k += 3)
{
    //Конвертируем из hex в byte
    table[i] = Byte.Parse(input.Substring(k, 2), System.Globalization.NumberStyles.HexNumber);

    //Если получаем число < 33 , заменяем на 46 (точка в ascii),
    //потому что в таблице ASCII символы начинаются с кода 33
    if (table[i] < 33)
    {
        table[i] = 46;
    }
}
//Конвертируем из byte в ascii
System.Text.Encoding ascii = System.Text.Encoding.UTF7;
string result = ascii.GetString(table);


Автор: Экскалупатор 9.4.2011, 01:22
что то вроде:
Код

 static void Main(string[] args)
        {
            string temp = "45 00 00 28 1D FA 40 00 80 06 22 17 C0 A8 00 65 3E 92 BB 1F 10 6A 00 50 74 04 75 B7 3E E4 32 A3 50 11 0F FC 79 1B 00 00";
            string[] strArray = temp.Split(' ');
            byte[] mass = new byte[strArray.Length];
            for (int i=0; i < strArray.Length; ++i)
            {
                mass[i] = Convert.ToByte(strArray[i], 16);
            }
            Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetString(mass));
        }


Добавлено @ 01:25
не обновил страницу перед ответом

Автор: hitman2010 9.4.2011, 08:29
Вы меня немного не так поняли, я же не знаю какой именно прийдёт пакет.

Код

private void OnNewPacket(PacketMonitor pm, Packet p) 
{
TextBox.Text = p.ToString(); 
// может как-нибуть  на этом этапе можно получить сразу строку из пакета?
}


в текстбоксе получаю 

Код

45 00 00 28 1D FA 40 00 80 06 22 17 C0 A8 00 65  E..(.ú@.€.".À¨.e
3E 92 BB 1F 10 6A 00 50 74 04 75 B7 3E E4 32 A3  >’»..j.Pt.u·>ä2£
50 11 0F FC 79 1B 00 00                          P..üy...



Автор: Экскалупатор 9.4.2011, 11:16
Цитата(hitman2010 @  9.4.2011,  07:29 Найти цитируемый пост)
я же не знаю какой именно прийдёт пакет.

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

string temp = "45 00 00 28 1D F..
на
string temp = p.ToString(); 

и
Код

Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetString(mass));
на
TextBox.Text = System.Text.ASCIIEncoding.ASCII.GetString(mass);

и у тебя в текстбоксе будет появляться строка которую ты хотел
или ты хочешь сказать что тебе приходит в пакете именно вот такая строка???
Цитата(hitman2010 @  9.4.2011,  07:29 Найти цитируемый пост)
в текстбоксе получаю 
    
45 00 00 28 1D FA 40 00 80 06 22 17 C0 A8 00 65  E..(.ú@.€.".À¨.e
3E 92 BB 1F 10 6A 00 50 74 04 75 B7 3E E4 32 A3  >’»..j.Pt.u·>ä2£
50 11 0F FC 79 1B 00 00                          P..üy...


Автор: hitman2010 9.4.2011, 11:41
или ты хочешь сказать что тебе приходит в пакете именно вот такая строка???
Цитата(hitman2010 @  9.4.2011,  07:29 Найти цитируемый пост)
в текстбоксе получаю 
    
45 00 00 28 1D FA 40 00 80 06 22 17 C0 A8 00 65  E..(.ú@.€.".À¨.e
3E 92 BB 1F 10 6A 00 50 74 04 75 B7 3E E4 32 A3  >’»..j.Pt.u·>ä2£
50 11 0F FC 79 1B 00 00                          P..üy...


Именно это я и хотел сказать. 

Автор: Экскалупатор 9.4.2011, 12:31
а что это за тип данных Packet?
может у него есть метод или свойство которое возвращает то что тебе нужно? ну или хотя бы ASCII коды? довольно странно что он сразу возвращает в таком странно виде

потому что в противном случае тебе придется разбирать эту строку руками.

Автор: hitman2010 9.4.2011, 14:21
Вобщем нарыл я в нете снифер(сорцы прикрепил), мне нужно чтоб на первой форме "PacketMonitorForm" в текстбоксе отображалось содержимое последнего входящего\исходящего пакета. Кто шарит помогите плиз.

Автор: Экскалупатор 9.4.2011, 15:05
hitman2010, вот меня всегда удивляло это, почему не посмотреть что написано в классе Pack и как он работает, и там же изменить все как тебе нужно.
в этом классе есть метод
Код

public string ToString(bool raw) {
            StringBuilder sb = new StringBuilder(Raw.Length);
            if (raw) {
                for(int i = 0; i < Raw.Length; i++) {
                    if (Raw[i] > 31)
                        sb.Append((char)Raw[i]);
                    else
                        sb.Append(".");
                }
            } else {
                string rawString = this.ToString(true);
                for(int i = 0; i < Raw.Length; i += 16) {
                    for(int j = i; j < Raw.Length && j < i + 16; j++) {
                        sb.Append(Raw[j].ToString("X2") + " ");
                    }
                    if (rawString.Length < i + 16) {
                        sb.Append(' ', ((16 - (rawString.Length % 16)) % 16) * 3);
                        sb.Append(" " + rawString.Substring(i) + "\r\n");
                    } else {
                        sb.Append(" " + rawString.Substring(i, 16) + "\r\n");
                    }
                }
            }
            return sb.ToString();
        }


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

Автор: hitman2010 9.4.2011, 15:58
Цитата(Экскалупатор @ 9.4.2011,  15:05)
hitman2010, вот меня всегда удивляло это, почему не посмотреть что написано в классе Pack и как он работает, и там же изменить все как тебе нужно.
в этом классе есть метод
который возвращает строку в том виде в котором ты ее получаешь, измени так как тебе нужно или напиши свой и будет все круто.

Спасибо за наводку, проблема решена.

Автор: Экскалупатор 9.4.2011, 16:30
hitman2010, как бы общее замечание, на мой взгляд подобной логике не место в этом классе, т.е. класс пакета не должен выводить строку в подобном виде, иначе будут получаться такие проблемы(с чем ты и столкнулся), сделай для него класс, который будет работать с пакетом и преобразовывать тебе массив байт в то что тебе нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)