/// <summary> /// <para>Поиск элемента в данных, адресуемых указателем</para> /// </summary> /// <param name="ptr">Указатель на данные</param> /// <param name="elem">Искомый элемент</param> /// <param name="length">Размер области данных, в которой производится поиск</param> /// <returns>Указатель на позицию первого вхождения элемента в данных или null</returns> public static PByte MemChr(PByte ptr, byte elem, long length) { #region Проверка аргументов #if CHECK_ARGS if (ptr is null) { throw new ArgumentNullException(nameof(ptr)); } if (length < 0 || length > ptr.Length) { throw new ArgumentOutOfRangeException(nameof(length)); } #endif #endregion Проверка аргументов IComparer <byte> cmp = Comparer <byte> .Default; for (var i = 0L; i < length; i++) { if (cmp.Compare(ptr[i], elem) == 0) { return(new(ptr, i)); } } return(null); }
/// <summary> /// <para>Сравнение векторов</para> /// </summary> /// <param name="mem1">Первый вектор</param> /// <param name="mem2">Второй вектор</param> /// <param name="length">Размер сравниваемой области</param> /// <returns>Результат сравения</returns> public static int MemCmp(PByte mem1, PByte mem2, long length) { #region Проверка аргументов #if CHECK_ARGS if (mem1 is null) { throw new ArgumentNullException(nameof(mem1)); } if (mem2 is null) { throw new ArgumentNullException(nameof(mem2)); } if ((length < 0) || (length > mem1.Length) || (length > mem2.Length)) { throw new ArgumentOutOfRangeException(nameof(length)); } #endif #endregion Проверка аргументов IComparer <byte> cmp = Comparer <byte> .Default; for (var i = 0L; i < length; i++) { var rc = cmp.Compare(mem1[i], mem2[i]); if (rc != 0) { return(rc); } } return(0); }
/// <summary> /// <para>Поиск последнего вхождения субвектора в вектор</para> /// </summary> /// <param name="mem1">Исходный вектор</param> /// <param name="len1">Размер области вектора для поиска</param> /// <param name="mem2">Субвектор</param> /// <param name="len2">Размер искомой области субвектора</param> /// <returns></returns> public static PByte MemRMem(PByte mem1, long len1, PByte mem2, long len2) { #region Проверка аргументов #if CHECK_ARGS if (mem1 is null) { throw new ArgumentNullException(nameof(mem1)); } if (mem2 is null) { throw new ArgumentNullException(nameof(mem2)); } if (len1 < 0 || len1 > mem1.Length) { throw new ArgumentOutOfRangeException(nameof(len1)); } if (len2 < 0 || len2 > mem2.Length) { throw new ArgumentOutOfRangeException(nameof(len2)); } #endif #endregion Проверка аргументов long i; if (len1 == 0 || len2 == 0) { return(null); } if (len1 < len2) { return(null); } i = len1 - len2; do { if (MemCmp(mem1 + i, mem2, len2) == 0) { return(mem1 + i); } } while (i-- != 0); return(null); }