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


Автор: PsyNejumi303 21.3.2006, 21:29
как можно прочесть определенное количество байт или символов из файла?
пытаюсь тэги из мп3 вытащить.

Код

            FileStream mp3id3 = File.Open(filename, FileMode.Open, FileAccess.Read);
             Byte[] byt = new Byte[128];
            label1.Text = mp3id3.Read(byt, (int)mp3id3.Length - 128, 128).ToString();


компилица норм. но когда начинает выполняца эта функция, то вот что пишет: "Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."

помогите плиз.

Автор: -ser- 22.3.2006, 06:25
вся индексация в программировании начинается с 0.

не вдаваясь в семантику написанного, я не знаю где находятся теги в МР3.
здесь мы пытаемся прочитать последние 128 байт, тогда начало указывается
Код
( mp3id3.Length - 1 ) - 128


Автор: PsyNejumi303 22.3.2006, 08:57
-ser-, так тож не получаецо. тож самое пишет.
а тэги первой версии как раз лежат в последних 128 байтах.
я ща сделал вот так:
Код

FileStream mp3id3 = File.Open(filename, FileMode.Open, FileAccess.Read);
for (long i = mp3id3.Length - 128; i < mp3id3.Length; i++)
            {
                mp3id3.Seek(i, SeekOrigin.Begin);
                byte b = (byte)mp3id3.ReadByte();
                label1.Text = label1.Text + ((char)b).ToString();
            }

но цыкл мне чот не очень нравицо.

Автор: mr.DUDA 22.3.2006, 11:37
Второй аргумент Read указывает смещение не в потоке, а в массиве-приёмнике. Поэтому юзаем FileStream.Seek, причём юзаем только 1 раз, и читаем не побайтно а сразу 128 байт. В Seek можно указать смещение не вперёд а назад (от конца файла), что нам и нужно. Окончательно:
Код
using System;
using System.IO;

class TestApp
{
    static void Main(string[] args)
    {
        FileStream file = File.OpenRead(@"c:\1.mp3");
        byte[] arr = new byte[128];
        file.Seek(-128, SeekOrigin.End);
        file.Read(arr, 0, 128);
    }
}

Добавлено @ 11:40
З.Ы. мп3-тэг лежит в двоичном виде, поэтому если выводить его в string "как есть" - получим набор кракозябл с нормальными строками посредине.

Автор: PsyNejumi303 22.3.2006, 12:29
mr.DUDA, во. бальшое спасибо.
так красивше чем мой цыкл. и умнее)
а есть возможность вытащить например ток 4 байта находящиеся где-нить по середине.

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