2010-10-04 3 views
1

Я пытаюсь прочитать кодированный файл UTF8 (.torrent). В файле есть раздел «штук». Непосредственно следуя этому, это длина текста, содержащего последовательность хэшей SHA1. Файл сообщает длину (скажем, 130100) для чтения, но при чтении я заканчиваю передачу EOF.Разница в размере при чтении кодированного файла UTF8

Я не уверен, почему это происходит. Файлы хороши (я проверил их с существующими торрент-клиентов, и я попробовал несколько из них с последовательными результатами) и я читаю их с этим:

string contents = string.Empty; 
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read) 
{ 
    using (StreamReader reader = new StreamReader(fs, Encoding.UTF8)) 
    { 
     contents = reader.ReadToEnd(); 
    } 
} 

parse(contents); 

Однако, это, очевидно, не за работой. Я читаю файл неправильно, или я храню его в строке неправильно, прежде чем пытаться его разобрать? Кажется, что это только ошибка, когда он читает символы за пределами обычного диапазона читаемых строк.

+0

Откуда вы знаете, что читаете EOF? Исправлено ли 'ReadToEnd' исключение? Если да, то? –

+0

Почему вы не печатаете позицию файла после записи длины, а затем проверяете оставшуюся длину в шестнадцатеричном редакторе? Затем вы увидите, правильный ли файл (и, следовательно, ваш код неправильный). – AndiDog

+0

@ Майкл Петротта. Виноват; Я должен уточнить: я не читаю переданный EOF, но данная длина из торрент-файла для «штук» проходит мимо длины оставшейся части содержимого, которое я прочитал из файла. –

ответ

5

Файлы BitTorrent не кодируются в кодировке UTF-8. Некоторыми или всеми именами файлов в свойстве могут быть кодированные строки UTF-8, но файл в целом является чисто двоичным, а содержимое свойства pieces является двоичной строкой, содержащей хеши. Нет смысла пытаться читать .torrent с помощью TextReader.

Формат, в котором хранятся файлы BitTorrent, представляет собой простую сериализацию структурированных значений, известную как bencode. Вы хотите использовать правильный анализатор bencode для извлечения информации из файла .torrent. Нетрудно написать один (в конце концов, вы получаете только четыре типа данных) или см. theory's libraries list для пары существующих библиотек .NET.

+0

Я написал реализацию, которая может кодировать и декодировать строки в/из bencoding. Это то, что я тестирую. Я могу успешно декодировать весь файл .torrent с этим 1 исключением. Я не хочу использовать существующую библиотеку (и те, которые связаны, либо n/a для .NET, либо требуют, чтобы я dl/install git получал). Спасибо за ваш ответ, но это мне не помогает. –

+0

Кроме того, возможно, вы можете уточнить: учитывая, что остальная часть файла не является проблемой, только эта одна часть. Спецификация определяет «фигурные карты для строки, длина которой кратна 20» и «Все строки в файле .torrent, содержащие текст, должны кодироваться в кодировке UTF-8», почему использование StreamReader не рекомендуется? –

+1

Но не все строки содержат «текст». 'штук', в частности, не будет. Это байтовая строка, представляющая двоичные хэши, а не текстовые символы, и почти никогда не будет создавать действительные последовательности UTF-8. Вам придется разобрать его в структуру 'byte []', а не 'String'. К сожалению, формат bencode не говорит вам, какие строки являются двоичными и которые содержат текст (в основном потому, что формат изначально был разработан без концепции Unicode), что оставляет вас в состоянии вернуть 'byte []' для всего , – bobince

Смежные вопросы