Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Требуется *Оптимальный* алгоритм / 5 сообщений из 5, страница 1 из 1
14.12.2003, 14:11
    #32352048
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется *Оптимальный* алгоритм
ДАНО: строка, содержащая шестнадцатиричное представление числа:

Код: plaintext
char s[] =  "7B5A66" ;


И буфер:

Код: plaintext
BYTE b[ 3 ];


ТРЕБУЕТСЯ: получить в каждом байте буфера значение из s.

То есть, дожно быть:

Код: plaintext
1.
2.
b[ 0 ] = 0x7B;
b[ 1 ] = 0x5A;
b[ 2 ] = 0x66;



Спасибо
...
Рейтинг: 0 / 0
14.12.2003, 17:25
    #32352091
Нуф-нуф
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется *Оптимальный* алгоритм
Драсте...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Символ = ASCII
   0     =   48 
      ...
   9     =   57 

  A    =   65 
      ...
  F    =   70 

char GetTetrada() {
 1 . КодСимвола -=  48 , получаем  0 = 0 ... 9 = 9 , A= 17 ...F= 22 
 2 . Если (КодСимвола >  9 ), то КодСимвола -=  7 , получаем A= 10 ...F= 15 ;
 3 . return КодСимвола;
//На выходе имеем байтовое значение, эквивалентное значению одного символа;
};
Ну и в целом:
Читаем первый символ, получаем из него тетраду (GetTetrada()), сдвигаем ее на четыре бита влево, получаем тетраду для следующего символа и складываем ее с ранее полученным результатом. Всё дело повторить необходимое кол-во раз.

Не плохо бы предусмотреть еще и строчные буквы, но это в ТЗ не описано :)

//проба сил, ногами не бить :)
...
Рейтинг: 0 / 0
15.12.2003, 00:20
    #32352180
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется *Оптимальный* алгоритм
на вскидку...

если принять, что длина строки равна ровно 6 символов и однозначно не содержит ошибок, то оптимальным будет "в лоб":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
inline int hex2int(char c) {
    return (c<='9')?c-'0':toupper(c)-'A';
}

inline hex2bin(const char* s, char* b) {
    *b++=hex2int(s++)* 16 +hex2int(s++);
    *b++=hex2int(s++)* 16 +hex2int(s++);
    *b=hex2int(s++)* 16 +hex2int(s);
}



если условия общие, то тут как хошь, неплохим вариантом будет применение sscanf для считывания hex-числа.

Код: plaintext
1.
2.
3.
4.
5.
int i;
char s[] =  "7B5A66" ;
BYTE b[ 3 ];
if(sscanf(s, &i)== 1 ) {
  memcpy(b, &i,  3 );
}
...
Рейтинг: 0 / 0
15.12.2003, 19:35
    #32353210
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется *Оптимальный* алгоритм
сорри, недописал параметр...

sscanf(s, "%x", &i)
...
Рейтинг: 0 / 0
16.12.2003, 13:44
    #32353881
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется *Оптимальный* алгоритм
Спасибо, но это не много не то. В данный момент объяснить не могу, чуть позже.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Требуется *Оптимальный* алгоритм / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]