Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
72 / 72 / 6
Регистрация: 16.06.2012
Сообщений: 220
1
.NET 4.x

Как разобраться с кодировками в консольном торрент-клиенте

19.08.2012, 22:12. Показов 1306. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, о великие и могучие умы данного форума. Проблема возникла на моем пути и не решается легко. Консультация Ваша потребовалась...

Так..Если серьезно, то пишу консольный торрент-клиент и как обычно, у меня с шарпом одна проблема - я плохо работаю с кодировками.

Суть вопроса - на запрос трекеру подается SHA-1 хешкод (20 символов), причем их необходимо закодировать в виде %hh, где h - шестнадцатеричная цифра. (кодировать необходимо, если они не входят в определенное множество символов. RFC 1738)

Для прогона я взял торрент ubuntu - в нем выдрал все нужное, перекодирование сделал так
C#
1
2
3
4
5
6
7
8
9
string info_hash = "";
            
            foreach (var x in hash)
            {
                if ((x>='0' && x <= '9') || (x>='a' && x<='z') || (x>='A' && x<='Z') || inGoodChars(x))
                   info_hash += x;
                else
                    info_hash += "%" + x16[(byte)x / 16] + x16[(byte)x % 16];
            }
Торрент файл пытался (поочередно) обрабатывать, как Encoding.ASCII (7-бит -> многие символы становились вопросами)
Encoding.UTF8 - 16 бит на символ - многовато(
Encoding.Default (то бишь, ANSI)- самая правдоподобная, но тем не менее ответ был -
"d14:failure reason63:Requested download is not authorized for use with this tracker.e"
То бишь у меня трабл с описанием...
И да, пробовал все символы переводить в представление %hh - также не помогло...

Буду рад Вашим мыслям по данному поводу
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2012, 22:12
Ответы с готовыми решениями:

Проблема с кодировками (с русскими буквами) в консольном приложении.
Что нужно дописать чтобы программа выводила все надписи на русском языке, а не только первую? ...

После 15 минут пропадает Интернет в браузере и торрент-клиенте
OpenSUSE 12.3. После загрузки система подключается к интернету (через локальную сеть, проверка...

Не могу разобраться в чем у меня проблема. Не выводит оценку в консольном приложении
Доброе время суток. Пытаюсь сделать так, чтобы у меня в конце теста выводилась оценка, но вместо...

когда пользователь обрывает прием информаци на клиенте - виснет IE на клиенте
Такая проблема. Корпоративный сайт, выдаются большие объемы информации. И когда пользователь...

9
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
19.08.2012, 22:30 2
sha1.ComputeHash выдает тебе массив байт
чтоб перегнать его в строку нужного вида достаточно использовать System.Web.HttpUtility.UrlEncode

m0nax, Hash уже есть в файле.
нет, его там нет
есть только сама по себе структура-словарь "info", после ее чтения с нее берется хеш
1
47 / 47 / 9
Регистрация: 13.02.2012
Сообщений: 176
19.08.2012, 22:31 3
Попробую внести для себя ясность.
1) В какой кодировке общается сервер?
2) В какой кодировке ты получаешь SHA-1?
0
72 / 72 / 6
Регистрация: 16.06.2012
Сообщений: 220
19.08.2012, 22:55  [ТС] 4
m0nax, Hash уже есть в файле.

bumbaram, Имеется описание, (BitTorrent Protocol), что символы записаны в ASCII, однако, т.к. он содержит 7 бит, то (касаемо SHA1) 1 бит остается пустым, символы, где этот бит обращен в 1 и записываются как %hh. Чтение происходит в формате ANSI. Сервер работает (как правило) в том же режиме.

Добавлено через 11 минут
m0nax, pieces - строка длиной 20*pieces_length, где каждые 20 символов - SHA1 хеш части. пруф http://jonas.nitro.dk/bittorre... t-rfc.html

Добавлено через 1 минуту
System.Web.HttpUtility.UrlEncode - не допускает имя класса - HttpUtility..

Дебильный вопрос (я понимаю), но HttpUtility действительно у меня не определяется как класс... В чем может быть дело?

Добавлено через 8 минут
Так... с HttpUtility разобрался... счас через него попробую
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
19.08.2012, 22:55 5
ну да, тут все запущенней чем я подумал
info_hash который отправляют на трекер и pieces в торрент файле это абсолютно разные вещи

торрент файл это не текстовый файл, его нельзя читать как текстовый файл, к нему(целиком) нельзя применять какие либо кодировки
в кодировке ASCII там записаны только сами элементы формата, например вот тут жирным это ASCII
d14:failure reason63:Requested download is not authorized for use with this tracker.e
все остальное - нет, там могут быть любые данные, в том числе чистые массивы байтов для которых любой перевод в строку смертелен

вот как раз поля pieces это и есть просто последовательность байтов
0
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
19.08.2012, 22:55 6
info_hash += "%" + x16[(byte)x / 16] + x16[(byte)x % 16];
черт. а почему так сложно ? , я думал все вопросы решаются стандартными классами кодировки и хэширования.
0
72 / 72 / 6
Регистрация: 16.06.2012
Сообщений: 220
19.08.2012, 23:06  [ТС] 7
m0nax, все же не дурак я... работал с ним через BinaryReader... Не текстовый файл....

Добавлено через 9 минут
m0nax, Спасибо UrlEncode решил проблему...
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
19.08.2012, 23:06 8
короче, info_hash это хеш со всего блока info в торрент файле
в этом блоке кроме всего прочего лежат блоки pieces, которые сами по себе является набором хешей для частей файлов

со всего этого блока со всеми потрохами берется sha1 хеш и получается info_hash, который потом кодируется UrlEncode отправляется на трекер
0
47 / 47 / 9
Регистрация: 13.02.2012
Сообщений: 176
19.08.2012, 23:07 9
Мож я че не понял. Но допустим ты получил строку с sha-1 от какого-то файла. Потом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            using(StreamWriter writer = new StreamWriter("test.txt"))
            {
                string sha = "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12";
                byte[] bytes = Encoding.Default.GetBytes(sha.ToCharArray());
                char[] ansi_sha = Encoding.ASCII.GetChars(bytes);
                writer.Write(ansi_sha);                
            }
            Console.WriteLine("program is done");
            Console.Read();
        }
    }
}
Файл проверил, точно в ANSII и точно те символы.
0
72 / 72 / 6
Регистрация: 16.06.2012
Сообщений: 220
19.08.2012, 23:08  [ТС] 10
Спецификацию протоколов читать умею =)
Я замудрил больно с переводом....
Спасибо за подкинутый класс HttpUtility
0
19.08.2012, 23:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2012, 23:08
Помогаю со студенческими работами здесь

Как работать с кодировками в PHP?
Вообщем, для работы header() и сессий нужно, чтобы стояла кодировка &quot;UTF-8 без BOM&quot;, но если её...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru