/// <summary> /// Преобразование четырех символов "HEX-представления" в int16 /// </summary> /// <param name="value">Возвращаемое значение</param> /// <param name="source">Исходный массив "HEX-данных"</param> /// <param name="startOutPos">Стартовая позиция во входном массиве для преобразования</param> private bool HEXToInt16(ref int value, Char[] source, int startInPos) { // Если указываем такую позицию для вывода текстового представления, // которая выходит за допустимые пределы целевого массива, сообщаем // об этом if ((startInPos + 3) > source.GetUpperBound(0)) { return false; } // Изначально обнуляем возвращаемое значение value = 0; // Преобразуем четыре текстовых представления "HEX" в данные переменной "int" for (int i = startInPos, shift = 12; i < (startInPos + 4); i++, shift -= 4) { // Изначально полагаем, что символ не найден в словаре "_HEX" bool letterSearchRes = false; // Индексный эквивалент символа в словаре int letterIdx = 0; // Пробегаемся по всему словарю "_HEX" for (int j = 0; j < 16; j++) { // Если текущий символ совпал с имеющимся в словаре if (source[i] == _HEX[j]) { letterSearchRes = true; letterIdx = j; break; } } // Если хотя бы один символ не был найдерн в словаре, // сообщаем что произошла ошибка декодирования параметров if (letterSearchRes != true) { return false; } // Если дошли до данного участка кода, можно преобразовывать // текущий индекс к требуемому разряду целевой переменной int16 value += (letterIdx << shift); } return true; }
public void TestGetUpperBound() { { bool errorThrown = false; try { char[] c = {'a', 'b', 'c'}; c.GetUpperBound(-1); } catch (IndexOutOfRangeException) { errorThrown = true; } Assert("#H61", errorThrown); } { bool errorThrown = false; try { char[] c = {'a', 'b', 'c'}; c.GetUpperBound(1); } catch (IndexOutOfRangeException) { errorThrown = true; } Assert("#H62", errorThrown); } char[] c1 = new Char[5]; AssertEquals("#H63", 4, c1.GetUpperBound(0)); char[,] c2 = new Char[4,6]; AssertEquals("#H64", 3, c2.GetUpperBound(0)); AssertEquals("#H65", 5, c2.GetUpperBound(1)); }
/// <summary> /// Преобразование значения int в четыре символа "HEX-представления" /// </summary> /// <param name="value">Исходное значение</param> /// <param name="target">Целевой массив для вывода</param> /// <param name="startOutPos">Стартовая позиция в массиве для преобразования</param> private bool Int16ToHEX(int value, ref Char[] target, int startOutPos) { // Если указываем такую позицию для вывода текстового представления, // которая выходит за допустимые пределы целевого массива, сообщаем // об этом if ((startOutPos + 3) > target.GetUpperBound(0)) { return false; } // Преобразуем данные переменной в четыре текстовых представления "HEX" target[startOutPos + 3] = _HEX[((value & 0x0000000F) >> 0)]; target[startOutPos + 2] = _HEX[((value & 0x000000F0) >> 4)]; target[startOutPos + 1] = _HEX[((value & 0x00000F00) >> 8)]; target[startOutPos + 0] = _HEX[((value & 0x0000F000) >> 12)]; return true; }