Обмен байтов в файле - PullRequest
1 голос
/ 31 мая 2009

Я читаю необработанный аудиофайл (копирование дорожки с компакт-диска), выполняю обмен байтами, а затем записываю обратно в файл wav.

Подпрограмма, которую я имею, обрабатывает байты должным образом, но делает только половину файла. Я разработчик VB.NET, а не разработчик C #, и этот код не конвертируется в VB.NET должным образом (он получает ошибку переполнения).

Это не столько "своп", сколько кальций / чернослив. (короткий) ((буфер [i + 1] * 256) + буфер [i])

Я считаю, что он пишет только половину сэмплов, но я не знаю, как это исправить!

        public static short[] SwapBytesArray(string fileName)
    {
        byte[] buffer = System.IO.File.ReadAllBytes(fileName);
        long fileLength = buffer.LongLength;
        if ((fileLength & 1) == 1)
        {
            throw new ArgumentException("File length must be an even number of bytes");
        }
        System.Collections.Generic.List<short> sList = new System.Collections.Generic.List<short>();


        for (long i = 0; i < fileLength - 1; i += 2)
        {
            byte tmp = buffer[i];
            sList.Add((short)((buffer[i + 1] * 256) + buffer[i]));
            //buffer[i + 1] = tmp;
        }
        return sList.ToArray();
    }

Ответы [ 4 ]

1 голос
/ 31 мая 2009

Я думаю, что потоковый подход будет более эффективным и менее подверженным ошибкам. .NET имеет очень хорошую поддержку потоков, поэтому должно работать что-то вроде следующего:

public void SwapBytesStreamed(Stream inputStream, Stream outputStream)
{
    byte[] bytePair = new byte[2];
    long offset = 0;
    while (offset < inputStream.Length)
    {
        int bytesRead = inputStream.Read(bytePair, 0, 2);
        if (bytesRead == 0) break;

        if (bytesRead == 2)
        {
            outputStream.WriteByte(bytePair[1]);
        }
        outputStream.WriteByte(bytePair[0]);

        offset += bytesRead;
    }
}

Затем используйте его следующим образом:

public Stream SwapBytesInFile(string filename)
{
    Stream inputStream = File.Open(filename, FileMode.Open);
    MemoryStream outputStream = new MemoryStream();

    SwapBytesStreamed(inputStream, outputStream);
}
1 голос
/ 31 мая 2009

Почему вы хотите вернуть массив short?

Если вы записываете обратно в файл, не будет ли лучше массив byte[]?

1007 * т.е. *

public static byte[] SwapBytes(string fileName)
{ 
    byte[] buffer = System.IO.File.ReadAllBytes(fileName);

    long fileLength = buffer.LongLength;

    if ((fileLength & 1) == 1)
    {
        throw new ArgumentException("File length must be an even number of bytes");
    }

    for (long i = 0; i < fileLength  - 1 ; i +=2 )
    {
        byte tmp = buffer[i];
        buffer[i] = buffer[i + 1];
        buffer[i + 1] = tmp;
    }

    return buffer;
}
1 голос
/ 31 мая 2009

Это кажется невероятно расточительным из памяти. Вы читаете весь файл как последовательность байтов, а затем дублируете его в массиве short[]. Вы даже можете повторить его снова, когда вернете этот массив.

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

1 голос
/ 31 мая 2009

Если размер файла больше, чем максимальное целое число, вы переполните индексную переменную (индекс должен быть длинным, так как num длинным) Предположительно, вы используете буфер

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