потоковый / буферный поток C# - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть класс Value, вывод Value используется в качестве входных данных для других классов и в конечном итоге в Main. В Main выполняется лог c, и вывод производится для первых 512 бит. Я хочу, чтобы моя программа возвращала значение value (), чтобы начать со следующих 512 бит файла file.txt. Как я могу это сделать?

public static byte[] Value()
        {
            byte[] numbers = new byte[9999];
            using (FileStream fs = File.Open(@"C:\Users\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))           
            using (BufferedStream bs = new BufferedStream(fs))
            using (StreamReader sr = new StreamReader(bs))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    for (int i = 0; i < 512; i++)
                    {
                        numbers[i] = Byte.Parse(line[i].ToString());
                    }
                }
            }         
            return numbers;
        }

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Что можно сделать, это передать Value() параметр смещения и длины.

Но есть проблема с вашим методом, вы фактически берете первые байты для каждой строки в файле, что я не знаю, что вы хотите сделать. Поэтому я исправил это, чтобы убедиться, что вы возвращаете только байты длины.

с использованием методов System.Linq Skip и Take, вам также может быть проще

public static byte[] Value(int startOffset, int length)
{
    byte allBytes = File.ReadAllBytes(@"C:\Users\file.txt");
    return allBytes.Skip(startOffset).Take(length);
}
0 голосов
/ 22 апреля 2020

@ TiGreX

 public static List<byte> ByteValueCaller()
        {
          List<byte> numbers = new List<byte>();

            GetValue(0, numbers);

            return numbers;
        }

        public static void GetValue(int startingByte, List<byte> numbers)
        {
            using (FileStream fs = File.Open(@"C:\Users\file1.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (BinaryReader br = new BinaryReader(fs))
            {
                //64bytes == 512bit
                //determines if the last position to use is inside your stream, or if the last position is the end of the stream.
                int bytesToRead = startingByte + 64 > br.BaseStream.Length ? (int)br.BaseStream.Length - startingByte : 64;


                //move your stream to the given possition
                br.BaseStream.Seek(startingByte, SeekOrigin.Begin);

                //populates databuffer with the given bytes
                byte[] dataBuffer = br.ReadBytes(bytesToRead);

                numbers.AddRange(dataBuffer);

                //recursive call to the same 
                if (startingByte + bytesToRead < fs.Length)
                    GetValue(startingByte + bytesToRead, numbers);
            }
        }
0 голосов
/ 17 апреля 2020

Похоже, что вы пытаетесь использовать рекурсивный вызов на Value(), это основано на вашем комментарии, но не ясно, поэтому я собираюсь сделать это предположение.

есть проблема, которую я вижу, и в вашем сценарии вы возвращаете byte[], поэтому я немного изменил ваш код, чтобы сделать его максимально близким к вашему.

/// <summary>
/// This method will call your `value` methodand return the bytes and it is the entry point for the loci.
/// </summary>
/// <returns></returns>
public static byte[] ByteValueCaller()
{
    byte[] numbers = new byte[9999];

    Value(0, numbers);

    return numbers;
}

public static void Value(int startingByte, byte[] numbers)
{

    using (FileStream fs = File.Open(@"C:\Users\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (BinaryReader br = new BinaryReader(fs))
    {
        //64bytes == 512bit
        //determines if the last position to use is inside your stream, or if the last position is the end of the stream.
        int bytesToRead = startingByte + 64 > br.BaseStream.Length ? (int)br.BaseStream.Length - startingByte : 64;


        //move your stream to the given possition
        br.BaseStream.Seek(startingByte, SeekOrigin.Begin);

        //populates databuffer with the given bytes
        byte[] dataBuffer = br.ReadBytes(bytesToRead);

        //This method will migrate from our temporal databuffer to the numbers array.
        TransformBufferArrayToNumbers(startingByte, dataBuffer, numbers);

        //recursive call to the same 
        if (startingByte + bytesToRead < fs.Length)
            Value(startingByte + bytesToRead, numbers);

    }


    static void TransformBufferArrayToNumbers(int startingByte, byte[] dataBuffer, byte[] numbers)
    {
        for (var i = 0; i < dataBuffer.Length; i++)
        {
            numbers[startingByte + i] = dataBuffer[i];
        }
    }
}

Кроме того, будьте осторожны с byte[9999], поскольку вы ограничиваете количество символов, которые вы можете получить, если это жестко заданное ограничение, я добавлю также эту информацию в if, которая определяет рекурсивный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...