реклама на сайте
подробности

 
 
 
Closed TopicStart new topic
> Конвертация ASCII последовательности в HEX код
den1s
сообщение Sep 13 2012, 07:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Здравствуйте, понадобилось тут хранить в памяти контролера таблицу с десятичными числами. Но т.к. памяти не очень много решил попробовать замутить некую компрессию - а именно преобразовывать последовательность из 3-х десятичных цифр в HEX код.
Примеры:
на входе последовательность из трех байт 0х30 0х32 0х36 (число 026) - на выходе 1 байт 0х1А (26 в шестнадцатиричной форме)
еще пример: 0х32 0х30 0х30 (200) -> 0xC8

Ограничение: число на входе не более 255 (т.е. 0х32 0х35 0х35). Си без ++.
Лучше именно алгоритм или код функции - без использования библиотек.

Может кто сталкивался с подобной задачкой? подскажите алготритм, а то что-то с математикой туго сегодня))


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Sep 13 2012, 07:21
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



ну понятно что нужно умножать на степени 10, начиная с конца буфера. примерно так:
Код
U8 mul = 1; //множитель
U8 out = 0; //результат
for (U8 i=sizeof(buf)-1; i!=0xFF; i--) {
    out += (buf[i] - 0x30) * mul;
    mul *= 10;
}


Сообщение отредактировал ukpyr - Sep 13 2012, 07:21
Go to the top of the page
 
+Quote Post
den1s
сообщение Sep 13 2012, 08:37
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Цитата(ukpyr @ Sep 13 2012, 11:21) *
ну понятно что нужно умножать на степени 10, начиная с конца буфера. примерно так:
Код
U8 mul = 1; //множитель
U8 out = 0; //результат
for (U8 i=sizeof(buf)-1; i!=0xFF; i--) {
    out += (buf[i] - 0x30) * mul;
    mul *= 10;
}


во блин... тупняк нашел:
я так же пытался делать, но только строка mul *= 10; у меня была mul *= 0х10; естесственно не то получалось
спасибо))


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 13 2012, 08:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



У buf[i] можно не отнимать 0х30, а просто брать младшие 4 бита, вам же нужны только цифры. Еще бы предусмотреть проверку на диапазон, если буфер получаете извне, а то вдруг там ошибки при приеме будут. В общем это некая разновидность bcd2bin получается, реализации в интернете встречаются, например http://www.codeforge.com/read/100978/bcd2bin.c__html


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Андрей190
сообщение Sep 13 2012, 09:53
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 24-12-06
Из: Орел
Пользователь №: 23 838



можно и так, с проверкой.
при передаче позаботьтесь, чтобы после цифр было не числовое значение

Код
U8 out, i, a;
out = 0;
i = 0;
while ((a = buf[i++] - '0') <=9) out = out * 10 + a;


или, если в буфере только три значения

Код
U8 out, i, a;
out = 0;
for (i = 0; i < 3; i++)
{
   if ((a = buf[i] - '0') > 9) break;
   out = out * 10 + a;
}
Go to the top of the page
 
+Quote Post
den1s
сообщение Oct 20 2012, 08:52
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Всем огромнейшее спасибо. Закрываю тему.


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 11:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.0326 секунд с 7
ELECTRONIX ©2004-2016