Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# преобразование пакета 
V
    Опции темы
hitman2010
  Дата 8.4.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.9.2010

Репутация: нет
Всего: нет



Есть 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..." ?

PM MAIL   Вверх
Экскалупатор
Дата 9.4.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



ASCII

конвертируй в int, а потом в каждый int в char
PM MAIL ICQ   Вверх
dextermd
Дата 9.4.2011, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



На входе имеем массив чисел в шестнадцатеричном формате (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);



Это сообщение отредактировал(а) dextermd - 9.4.2011, 01:10
PM MAIL   Вверх
Экскалупатор
Дата 9.4.2011, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



что то вроде:
Код

 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
не обновил страницу перед ответом

Это сообщение отредактировал(а) Экскалупатор - 9.4.2011, 01:33
PM MAIL ICQ   Вверх
hitman2010
  Дата 9.4.2011, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.9.2010

Репутация: нет
Всего: нет



Вы меня немного не так поняли, я же не знаю какой именно прийдёт пакет.

Код

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...



PM MAIL   Вверх
Экскалупатор
Дата 9.4.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(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...


PM MAIL ICQ   Вверх
hitman2010
Дата 9.4.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.9.2010

Репутация: нет
Всего: нет



или ты хочешь сказать что тебе приходит в пакете именно вот такая строка???
Цитата(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...


Именно это я и хотел сказать. 
PM MAIL   Вверх
Экскалупатор
Дата 9.4.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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

потому что в противном случае тебе придется разбирать эту строку руками.
PM MAIL ICQ   Вверх
hitman2010
Дата 9.4.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.9.2010

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) hitman2010 - 9.4.2011, 15:45
PM MAIL   Вверх
Экскалупатор
Дата 9.4.2011, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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();
        }


который возвращает строку в том виде в котором ты ее получаешь, измени так как тебе нужно или напиши свой и будет все круто.
PM MAIL ICQ   Вверх
hitman2010
Дата 9.4.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.9.2010

Репутация: нет
Всего: нет



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

Спасибо за наводку, проблема решена.
PM MAIL   Вверх
Экскалупатор
Дата 9.4.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



hitman2010, как бы общее замечание, на мой взгляд подобной логике не место в этом классе, т.е. класс пакета не должен выводить строку в подобном виде, иначе будут получаться такие проблемы(с чем ты и столкнулся), сделай для него класс, который будет работать с пакетом и преобразовывать тебе массив байт в то что тебе нужно.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.