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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> преобразование числа в строку
aspID
сообщение Feb 5 2008, 12:21
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Код
#ifndef _HEX_STRINGS_H_
#define _HEX_STRINGS_H_

unsigned char * AsciiToChar ( unsigned char * cAsciiString, unsigned char ucLen )
{
    unsigned char * p_ucBuf;
    unsigned char i;
    p_ucBuf = ( unsigned char * ) calloc ( ucLen / 2 + 1, sizeof ( unsigned char ) );

    //Convert HEX string to data
    for ( i = 0; i < ucLen; i += 2 )
    {
        p_ucBuf[ i / 2 ] = ( cAsciiString[ i ] > '9' ) ? ( cAsciiString[ i ] - 'A' + 10 ) : ( cAsciiString[ i ] - '0' );
        p_ucBuf[ i / 2 ] <<= 4;
        p_ucBuf[ i / 2 ] |= ( cAsciiString[ i + 1 ] > '9' ) ? ( cAsciiString[ i + 1 ] - 'A' + 10 ) : ( cAsciiString[ i + 1 ] - '0' );
    }
    
    p_ucBuf [ ucLen / 2 ] = 0;
    return p_ucBuf;
}

unsigned char * CharToAscii ( unsigned char * cHexData, unsigned char ucLen )
{
    unsigned char * p_ucBuf;
    unsigned char  i;
    p_ucBuf = ( unsigned char * ) calloc ( ucLen * 2 + 1, sizeof ( unsigned char ) );

    //Convert data to HEX string
    for ( i = 0; i < ucLen; i ++ )
    {
        p_ucBuf[ i * 2 + 1 ] = ( ( ( cHexData[ i ] ) & 0x0F ) > 9 ) ? ( ( cHexData[ i ] & 0x0F ) + 'A' - 10 ) : ( ( cHexData[ i ] & 0x0F ) + '0' );
        p_ucBuf[ i * 2 ] = ( ( cHexData [ i ] >> 4 ) > 9 ) ? ( ( cHexData[ i ] >> 4 ) + 'A' - 10 ) : ( ( cHexData[ i ] >> 4 ) + '0' );
    }
    
    p_ucBuf [ ucLen * 2 ] = 0;
    return p_ucBuf;
}

unsigned char * OctToSeptSMS ( unsigned char * p_ucData, unsigned char ucLen )
{
    //Convert octets to septets
    unsigned char * p_ucBuf;
    unsigned char i;
    p_ucBuf = ( unsigned char * ) calloc ( ucLen + ucLen / 7 + 1, sizeof ( unsigned char ) );

    unsigned char k, s;
    
    p_ucBuf[ 0 ] = p_ucData[ 0 ] & ~( 1 << 7 );

    for ( i = 1, k  = 7, s = 0; i < ucLen; i++ )
    {
        p_ucBuf[ i + s ] = ( p_ucData[ i - 1 ] >> k ) | ( p_ucData[ i ] << ( 8 - k ) );
        k--;
        if ( k == 1 )
        {
            s++;
            p_ucBuf[ i + s ] = ( p_ucData[ i - 1  ] >> k );
            k = 7;
        }
    }

    p_ucBuf [ ucLen + ucLen / 7 ] = 0;
    return p_ucBuf;
}

unsigned char * SeptToOctSMS ( unsigned char * p_ucData, unsigned char ucLen )
{
    //Convert octets to septets
    unsigned char * p_ucBuf;
    unsigned char i;
    p_ucBuf = ( unsigned char * ) calloc ( ucLen - ucLen / 8 + 1, sizeof ( unsigned char ) );

    unsigned char k, s;

    for ( i = 0, k = 0, s = 0; i < ucLen - 1; i++ )
    {
        p_ucBuf[ i - s ] = ( p_ucData[ i ] >> k ) | ( p_ucData[ i + 1 ] << ( 6 - k ) );
        k++;
        if ( k == 6 )
        {
            s++;
            i++;
            k = 0;
        }
    }

    p_ucBuf[ i - s ] = p_ucData[ i ] >> k;
    p_ucBuf [ ucLen - ucLen / 8 ] = 0;
    return p_ucBuf;
}

#endif //_HEX_STRINGS_H_


Все это для кодирования-декодирования SMS. На данный момент проблема в кодировании-декодировании кириллических сообщений. Не могу найти описания формата sad.gif

Забыл сказать - освобождение памяти - за "головой". Пример использования:
Код
p_ucBuf = AsciiToChar ( (unsigned char *)argv[2], strlen ( argv[2] ) );
p_ucStr = OctToSeptSMS ( (unsigned char *)p_ucBuf, strlen ( (char *) p_ucBuf ) );
free ( p_ucBuf );
p_ucBuf = p_ucStr;
p_ucStr = CharToAscii ( (unsigned char *)p_ucBuf, strlen ( (char *) p_ucBuf ) );
free ( p_ucBuf );
cout << p_ucStr << endl << flush;
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 5 2008, 12:45
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(aspID @ Feb 5 2008, 15:21) *
Все это для кодирования-декодирования SMS. На данный момент проблема в кодировании-декодировании кириллических сообщений. Не могу найти описания формата
Какой формат? Кодировка UCS2? Это - Unicode.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 5 2008, 14:54
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Andrеys @ Feb 5 2008, 14:15) *
я подозреваю ИАР версии 4.12
....
Позже приведу код, где явное изменение pwm почему-то не происходит,
А если объявите эту переменную с квалификатором volatile, то снова окажется, что виноват не компилятор, а чьи-то недостаточные знания языка С.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 6 2008, 11:21
Сообщение #19


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(zltigo @ Feb 5 2008, 00:26) *
Торопиться не надо - tolower уже не сработает, да и дважды вычитать тоже никчему - пару лишних команд (если об AVR речь идет).

Торопиться, действительно, не нужно. Но! Это не значит, что функции, которые я предлагаю общественному вниманию, не проверены. Тем более, что я "накидал по-быстрому" только первую функцию, а вторая была взята из рабочего проекта smile.gif
tolower там точно сработать не может, посколько там у меня toupper

А насчет вашего варианта, так его плюсы это более "понимабельный" код, поскольку он копирует человеческий процесс перевода hex в bin и не применяет неочевидных финтов.
И еще у него время обработки меньше зависит от входных данных, но это мало когда важно.

Из минусов отмечу (для AVR с ИАРом) больший на две команды размер кода за счет лишних переходов smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 6 2008, 12:27
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Baser @ Feb 6 2008, 14:21) *
Но! Это не значит, что функции, которые я предлагаю общественному вниманию, не проверены.

Да, уж... коррекция после приведеня к бинарному значению превысило мой уровень неочевидности smile.gif
Цитата
..и не применяет неочевидных финтов.

Применяет, но один smile.gif а не два.
Цитата
Из минусов отмечу (для AVR с ИАРом) больший на две команды размер кода за счет лишних переходов smile.gif

А это смотря как приведенный мной кусок smile.gif использовать:
AVR + IAR:
Код
               char tst1( char hi_char )
               {
                   if( hi_char > '9' )
   \   CPI     R16, 58
   \   BRCS    ??tst1_0
                 {   hi_char |= 0x20;    
                       hi_char -= 'A' + 10;
   \   ORI     R16, 0x20
   \   SUBI    R16, 75
   \   RET
                   }
                   else
                       hi_char -= '0';
   \   ??tst1_0:
   \   SUBI    R16, 48
                   return( hi_char );
   \   RET
               }
                



                   char tst2( char hi_char )
                  {
                 hi_char -= '0';
   \   SUBI    R16, 48
                if (hi_char > 9)
   \   CPI     R16, 10
   \   BRCS    ??tst2_0
                    {
                    hi_char &= ~0x20;    
                    hi_char -= 'A' - '0' - 0x0A;
   \   ANDI    R16, 0xDF
   \   SUBI    R16, 7
                   }
                return( hi_char );
   \   ??tst2_0:
   \   RET
              }

Можно и иногда на одну команду короче smile.gif, хотя и на одну больше sad.gif.
Результат - твой код для AVR более оптимален в большем числе случаев.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 14:25
Рейтинг@Mail.ru


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