Изменение элементов в массивах byte[] с помощью циклов (C#)C#

Место общения программистов C#
Ответить
Anonymous
 Изменение элементов в массивах byte[] с помощью циклов (C#)

Сообщение Anonymous »

Я получил массив byte[] из входного файла (текстовый файл ASCII) и пытаюсь удалить все байты предварительно установленного шестнадцатеричного значения без преобразования массива в строка и без использования списков.
Это код, который я придумал на данный момент:

Код: Выделить всё

byte[] byteLine = File.ReadAllBytes(filePath);
byte lineBreak = (byte)0x0d;
int breakIndex = Array.IndexOf(byteLine, lineBreak);
Это переменные, которые, как я думал, мне понадобятся, чтобы это работало. Здесь я нашел метод, который делает нечто похожее на то, что я пытался сделать, поэтому добавил код (как есть) в проект и попробовал использовать его в цикле. Сначала цикл for:

Код: Выделить всё

for(int i = 0; i < byteLine.Length; i++) {

byte v = byteLine[i];
if (v == lineBreak) {

RemoveRange(byteLine, breakIndex, 2);

}
}
Я пытался просмотреть каждый байт в массиве, пока не появится один эквивалент байта разрыва строки, затем я попытался вызвать метод, который начинается с индекса разрыва строки (breakIndex var) удаляет 2 байта (поскольку разрывы строк в ASCII используют 2 байта 0d0a). Предполагалось, что он будет циклически перебирать весь массив и повторять эту операцию для всех разрывов строк (lineBreak var). Я думал, что так будет, если я использую цикл for(;;) но это не так, я, должно быть, допустил ошибки. Вторая попытка использования foreach:

Код: Выделить всё

int t = breakIndex;
foreach (byte b in byteLine) {
if (b == lineBreak) {
while (t != 0)
{
RemoveRange(byteLine, breakIndex, 2);
t--;
}
}
}
Во втором цикле я добавил переменную (t) для использования в качестве «счетчика», которая начинается со значения индекса разрыва строки (breakIndex вар). Я знаю, что входной файл представляет собой квадратное изображение ASCII, поэтому он имеет то же количество строк, что и количество символов разрыва строки (минус один разрыв строки, потому что последний символ последней строки не является разрывом), поэтому цикл должен был циклически повторяться. количество раз, равное количеству разрывов строк, или до тех пор, пока t не достигнет значения 0, поскольку оно уменьшается на 1 после каждого цикла. Та же проблема в этом цикле: метод не сработал. Это третье и последнее, что я попробовал:

Код: Выделить всё

int t = 0;
foreach (byte b in byteLine) {
if (b == lineBreak) { do
{
RemoveRange(byteLine, breakIndex, 2);
t++;
}
while (t < breakIndex); }
}
}
Подобно другому циклу foreach, но он выполняется по возрастанию, а не по убыванию. Он должен был продолжать цикл до тех пор, пока переменная t не достигнет значения общего числа. разрывов строк. Я даже не знаю, правильно ли я использую do и while, я впервые пытаюсь использовать do. Тем не менее, я тестировал метод вне цикла, и он работает отлично, он просто удаляет первый разрыв строки, поскольку он не предназначен для самостоятельного зацикливания. После некоторого поиска я нашел этот ответ.
Прочитав этот ответ, я понял, что должен быть способ напрямую редактировать элементы в массив byte[] без множества обходных путей, проблема в том, что я не знаю, как применить это решение к моей проблеме, поскольку я не знаком с этими функциями C#.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-loops-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»