Консультация № 108988
12.11.2007, 00:45
0.00 руб.
0 2 2
Здравствуйте! В принцыпе в переходе от HEX к BIN все понятно! Вот не пойму для чего в селекторе вы указывали (вместе с ord) цифры 48, 55 и 87! Напишыте пожалуйста!

case ord(c16[i]) of
48..57: c2:=c2+masBin[ord(c16[i])-48]; //для 0..9
65..70: c2:=c2+masBin[ord(c16[i])-55]; //для A..F
97..102: c2:=c2+masBin[ord(c16[i])-87]; //для a..f

Обсуждение

Неизвестный
12.11.2007, 01:18
общий
это ответ
Здравствуйте, Мироненко Николай Николаевич!

Поскольку число в 16-ичной система счисления моет состоять из символов {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} либо {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}, а обращаться к элементу массива нужно только по ЦЕЛОЧИСЛЕННОМУ индексу, то приходится изначально символ переводить в его код с помощью функции ORD.

Код символа ‘A‘ равен 55, символа ‘a‘ равен 97, а символа ‘0‘ - 48.
Получаем что при значениях c16[i] равных <b>от ‘0‘ до ‘9‘</b> будем обращаться к таким элементам массива:
masBin[ord(‘0‘)-48] = masBin[0]
masBin[ord(‘1‘)-48] = masBin[1]
masBin[ord(‘2‘)-48] = masBin[2]
masBin[ord(‘3‘)-48] = masBin[3]
masBin[ord(‘4‘)-48] = masBin[4]
masBin[ord(‘5‘)-48] = masBin[5]
masBin[ord(‘6‘)-48] = masBin[6]
masBin[ord(‘7‘)-48] = masBin[7]
masBin[ord(‘8‘)-48] = masBin[8]
masBin[ord(‘9‘)-48] = masBin[9]

Аналогично рассмотрим диапазоны и для букв.
<b>от ‘A‘ до ‘F‘</b>
masBin[ord(‘A‘)-48] = masBin[10]
masBin[ord(‘B‘)-48] = masBin[11]
masBin[ord(‘C‘)-48] = masBin[12]
masBin[ord(‘D‘)-48] = masBin[13]
masBin[ord(‘E‘)-48] = masBin[14]
masBin[ord(‘F‘)-48] = masBin[15]

<b>от ‘a‘ до ‘f‘</b>
masBin[ord(‘a‘)-48] = masBin[10]
masBin[ord(‘b‘)-48] = masBin[11]
masBin[ord(‘c‘)-48] = masBin[12]
masBin[ord(‘d‘)-48] = masBin[13]
masBin[ord(‘e‘)-48] = masBin[14]
masBin[ord(‘f‘)-48] = masBin[15]

<i>Вот такая арифметика, и немного смекалки для компактного решения поставленной задачи ;).</i>

Возможно более понятно для этой же задачи будет запись выше описанного кода в таком виде:
<code>case c16[i] of
‘0‘..‘9‘: c2:=c2 + masBin[ord(c16[i]) - Ord(‘0‘)];
‘A‘..‘F‘: c2:=c2 + masBin[ord(c16[i]) - Ord(‘A‘)+10];
‘a‘..‘f‘: c2:=c2 + masBin[ord(c16[i]) - Ord(‘a‘)+10];</code>

Где <font color=purple><b>+10</b></font> - "поправка на ветер", поскольку в массиве соответствующие значения для букв начинаются с элемента с индексом 10.

Good Luck!!!
Неизвестный
12.11.2007, 01:26
общий
это ответ
<font color=blue><b>!!!</b></font>
Здравствуйте, Мироненко Николай Николаевич!

В DOSе и в Windows существует кодировка которая называется ANSI.
Разновидность набора ANSI, содержащая символы русского алфавита, называется Windows-1251.
цифры 0..9 хранятся в компьютере как числа 48..57
буквы A..F 65..70 и нижний регистр соответственно догадались
ord - это операция с порядковыми типами которая возвращает его порядковый номер<p><fieldset style=‘background-color:#EFEFEF; width:80%; border:blue 1px solid; padding:10px;‘ class=fieldset><font color=blue><i>В DOS‘е кодировка называется "ОЕМ" или "ср866". По сравнению с кодировкой ANSI (windows-1251), расположение русских букв там совершенно другое.</i>
-----
</font><font color=#777777 size=1><b>• Отредактировал: <a href=/info/user/425 target=_blank>sir henry</a></b> (Академик)
<b>• Дата редактирования:</b> 12.11.2007, 05:10</font></fieldset>
Форма ответа