2013-11-19 4 views
0

Мне нужно прочитать данные из разных типов файлов (wav, dll и т. Д.) Для алгоритма сжатия. Теперь алгоритм сортируется, однако у меня проблема при чтении из нетекстовых файлов. Что мне нужно сделать, так это прочитать ascii-представление каждого символа в файле, а затем применить мой алгоритм к тому, что я прочитал.чтение двоичного файла из любого типа файла в C#

Я использовал это для чтения (путь является строка, которая представляет собой путь к файлу, байты [а]):

if (path != "") { 
abc = File.ReadAllBytes(path); 
} 

Это прекрасно работает для текстовых файлов (DOC, TXT,. m и т. д.), но если я попытаюсь сделать это для DLL-файла, я получаю следующую ошибку: значение было слишком большим или слишком маленьким для байта без знака. Я также попытался установить abc как строку и использовать File.ReadAllText, а затем преобразовать каждый символ в строку в значение байта, но я получаю ту же ошибку. Я знаю, что wav-файл, например, состоит из специальных символов, если вы открываете его в текстовом редакторе, и до сих пор я думаю, что значение ascii для некоторых из этих символов превышает 255, что может привести к ошибке. Однако я не знаю, действительно ли это так, и я немного зациклен на том, что я могу сделать, чтобы разобраться в моей проблеме. Если у кого-нибудь есть идеи, я бы это оценил. Было бы неплохо, если бы вы могли придерживаться используемого языка (C#). Спасибо!

+0

Есть ли причина, что вы конкретно ориентация текста против двоичного ? В конце все двоично. Просто прочитайте байты и выполните сжатие в потоке байтов. Не обращайте внимания на то, что представляет собой фактический контент на данный момент (вы можете стать более умным с этим позже). –

+0

Вы уверены, что это место, где выбрано исключение? File.ReadAllBytes просто считывает файл в массив байтов, независимо от типа файла. Возможно, дальше вы делаете некоторые операции над байтами, которые вызывают исключение. Из-за характера алгоритма, который у вас есть, он может появиться только при попытке сжатия нетекстовых файлов. –

+0

Причина, по которой мне нужно это делать, это потому, что я должен придерживаться определенного алгоритма. Файл.ReadAllBytes выполняет чтение, но не может сохранить его в моей байтовой переменной [] abc. Мне нужно сохранить то, что читается как двоичное, а не что-то другое, и сейчас я не могу понять, как это сделать. Спасибо за быстрый ответ, хотя, это ценится. –

ответ

0

A байт - это значение от 0 до 255. Каждый файл на вашем компьютере состоит из нескольких байтов, независимо от того, являются ли они волновыми файлами, файлами DLL, текстовыми файлами или даже файлами без расширений. Вы можете ReadAllBytes из любого файла и всех байт, возвращаемых содержать значение от 0 до 255.

ASCII представляет собой набор символов, который содержит значение от 0 до 127 - есть расширения ASCII или кодовых страницы, которые содержат 256 возможных значений. Не все значения могут быть представлены (или отображаются), хотя - часть ASCII, и эти расширения являются управляющими символами, которые не имеют представления по умолчанию.

Нет символов ASCII за пределами 255 - символы, которые вы видите, - это текстовый редактор, который пытается сделать все возможное.

Ошибка вы получаете от преобразования что-то (а байт?) К UBYTE что позволяет значение от -128 до 127, в то время как большинство звуковых файлов, безусловно, содержат значения выше 127.

Короче говоря: вы не можете использовать ASCII для представления каждого возможного значения для байта. Вы можете использовать расширение ASCII для хранения значения байта, но это не имеет смысла для нетекстового файла («A, которые вы видите, когда вы открываете WAV-файл в текстовом редакторе, не предназначены для« A »).

Если вы хотите продолжить путь по выбранному вами пути, вам придется опубликовать код, в котором вы конвертируете байты в значение без знака или ASCII. Но вы, вероятно, должны попытаться «преобразовать» ваш алгоритм в двоичный.

+0

Я разобрал его, но информация, которую вы опубликовали, была хорошей, поэтому спасибо! На самом деле я просто делал плохое преобразование. –

0

Используйте следующий код:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
{ 
    byte[] buffer = new byte[fileStream.Length]; 
    fileStream.Read(buffer, 0, (int) fileStream.Length); 
    return buffer; 
} 

Пробовал читать kernel32.dll и user32.dll с этим кодом, и он работал нормально

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