- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
public static byte[] Trim(this byte[] origin_array)
{
int findex = -1, eindex = -1;
bool inseq = false;
if (origin_array[0] != 0x00)
{
if (origin_array[origin_array.Length - 1] != 0x00)
return origin_array;
findex = 0;
}
for (int i = 0; i < origin_array.Length; i++)
{
if (origin_array[i] == 0x00)
{
if (inseq)
continue;
else
inseq = true;
}
else
{
if (inseq)
if (findex == -1)
findex = i;
eindex = i;
}
}
if (findex == eindex)
return new byte[0];
byte[] result_array = new byte[eindex - findex + 1];
Array.Copy(origin_array, findex, result_array, 0, result_array.Length);
return result_array;
}
эквивалентно:
или
или
Свойство такого кода называется idempotency (не знаю, как по-русски, но смысл в том, что это преобразование, которое можно сделать только один раз, все последующие попытки выполнить те же действия над результатом ничего не изменят).
Ну и лишние переменные. Если функция должна была себя вести как аналог для строк, то имело бы смысл организовать два счетчика: один считает от начала, другой - от конца, и считать пока они не встретятся.
А вообще на Стековерфлоу есть секция код-ревью.
ps - чет я седня притормаживаю
http://ideone.com/b2xuHN
Array.Copy(bArray, --f, resultArray, 0, resultArray.Length);
Скорее всего так, иначе первое значение обрезается.
UPDATE: f>=e, а то можно пустой массив передать...
И почему &, а не &&?
Да и вообще, код можно написать гораздо проще: один цикл по нулям от начала массива, одни так же, но с конца, подвинуть кусок массива к началу и вызвать Array.Resize для отрезания мусора в хвосте. Последние два шага - только если нули были.
Антонимы first - last, start - end, left - right. Так что findex - eindex - это странно.
Отдельная проверка на пустой массив кажется странной, скорее всего, она покрывает какой-то баг.