На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование под PalmOS"
Правила раздела просты:
1. Будьте вежливыми.
2. Задавате вопросы только по теме. Пользовательские вопросы (у меня не работает пальм) являются оффтопиком. Пользуйтесь конференциями palmz.in, hpc.ru, ihand.ru .
3. Поиск вареза запрещен.
4. Пользуйтесь поиском. Не надейтесь, что кому-то доставляет удовольствие отвечать в сотый раз на один и тот же вопрос.
  
> Как получить в CW значение HEX символа , Как получить в CW значение HEX символа
    Подскажите какую функцию использовать в CW, чтобы получить значение HEX символа и наоборот (HEX -> символ)
    и если можно пример.
      гы, канешна можна.
      Вот пример.

      ExpandedWrap disabled
        //Получение НЕХ символа
        char ch = 'a';
        char h;
         
        h = ch;


      ExpandedWrap disabled
        //и наоборот (HEX -> символ)
        char ch;
        char h = 0x61;
         
        ch = h;
        Не работает
        он h присваивает 'a'
          Гм-м, странно... Даже не знаю что посоветовать...

          Под отладчиком надо пройтись.
          Поскольку случай очень странный, CodeWarrior отладчик здесь не поможет. Надо GDB прикрутить.
            Чёто я не пойму, Шуба, ты прикалываешься?

            ExpandedWrap disabled
              Int16 da = 97;
              char aq = (char)da;
               
              char aq = 'a';
              Int16 da = (Int16)aq;
              А я вообще чё-то не догоняю сути вопроса. :)
              Denfox777, можно поподробнее, что хотим получить?
                Объясняю, надо переконвертировать char в hex и наоборот.
                Задачка не из простых.

                Thunder, ты часом не знаешь как это сделать? Мож функцию какую-нибудь подскажешь?
                  Цитата
                  Объясняю, надо переконвертировать char в hex и наоборот.
                  Задачка не из простых.

                  Подождите ребята, что значит переконвертировать char в hex?? Char - это вам не число какое-нибудь, чтобы его в другие системы исчисления ковертировать. Я так понял автор топика хочет получить аски-код символа. Если так, то я привел пример, как это сделать.
                    Цитата debugx @
                    Цитата
                    Объясняю, надо переконвертировать char в hex и наоборот.
                    Задачка не из простых.

                    Подождите ребята, что значит переконвертировать char в hex?? Char - это вам не число какое-нибудь, чтобы его в другие системы исчисления ковертировать. Я так понял автор топика хочет получить аски-код символа. Если так, то я привел пример, как это сделать.

                    Э, нет. Тут не все так просто.
                    Для получения аски-символа никаких дополнительных действий делать не надо.
                    Но автор хотел именно "переконвертировать".

                    Судя по тому, что он (автор) уже не отвечает, то он все-таки нашел способ правильной "переконвертации".
                    И решением даже не поделился.
                      shub@
                      Решение пока не нашел

                      debugx
                      СПАСИБО!!! за пример получение аски-символа

                      Но в отладчике же можно посмотреть значение как HEX, как Character
                      значит есть какая то функция чтобы получить HEX значение символа
                        Цитата Denfox777 @


                        Но в отладчике же можно посмотреть значение как HEX, как Character
                        значит есть какая то функция чтобы получить HEX значение символа

                        Сдаюсь. Запишите мне поражение. :lool: :lool: :lool:
                        Сообщение отредактировано: shub@ -
                          StrIToH Function
                          Purpose Convert an integer to hexadecimal ASCII.
                          char *dds = ...
                          dds = StrIToH(dds, 97);
                          // dds = "000000061"

                          как обратно, не нашел. Да и смысла нет в обратном преобразовании, ведь всегда будет в наличие само число, с которым ведется работа. Если же надо распарсить чары с числом в виде хекса внутри, то это только если самому писать функцию.
                          Сообщение отредактировано: debugx -
                            Ага, всё, въехал :)
                            Держите, здесь есть поддержка bin, oct, hex
                            Вывод в строку, вроде, без лидирующих нулей - если надо, то доработай сам :)

                            ExpandedWrap disabled
                              /**********************************************************************/
                              #define bits_bin    1
                              #define bits_oct    3
                              #define bits_hex    4
                               
                              Char*  POSUtils_StrIToAHOB(Char* s, void* v, UInt16 size, UInt16 bits);
                              void   POSUtils_StrAHOBToI(Char* s, void* v, UInt16 size, UInt16 bits);
                               
                              /**********************************************************************/
                              Char* POSUtils_StrIToAHOB(Char* s, void* v, UInt16 size, UInt16 bits)
                              {
                                  UInt32 value = (size == sizeof(UInt32)) ? *(UInt32*)v : ((size == sizeof(UInt16)) ? *(UInt16*)v : *(UInt8*)v);
                                  Char*  text  = s;
                               
                                  if (value == 0)
                                  {
                                      *text++ = '0';
                                  }
                                  else
                                  {
                                      Boolean nonZeroSeen = false;
                                      UInt32  mask        = (0x0000000FUL << (32 - bits)) >> (32 - size * 8);
                                      UInt32  shift       = (size * 8) % bits;
                                      UInt16  count       = (size * 8) / bits;
                                      UInt16  i;
                               
                                      if (shift ==    0) shift = bits;
                                      if (shift != bits) count++;
                               
                                      for (i = 0; i < count; i++)
                                      {
                                          UInt32 digit = (value & mask) >> (size * 8 - shift);
                               
                                          if (digit != 0 || nonZeroSeen)
                                          {
                                              *text++     = (digit <= 9) ? digit + '0' : digit - 10 + 'A';
                                              nonZeroSeen = true;
                                          }
                               
                                          value <<= shift;
                                          shift = bits;
                                      }
                                  }
                               
                                  *text = nullChr;
                               
                                  return s;
                              }
                               
                              /**********************************************************************/
                              void POSUtils_StrAHOBToI(Char* s, void* v, UInt16 size, UInt16 bits)
                              {
                                  Int32 result = 0;
                                  Int16 mult   = 1 << bits;
                                  Int16 sign   = 1;
                                  Char  c      = *s++;
                               
                                  if (c == '-')
                                  {
                                      sign = -1;
                                      c    = *s++;
                                  }
                               
                                  while (c)
                                  {
                                      if (c >= '0' && c <= '9')
                                      {
                                          result = result * mult + c - '0';
                                      }
                                      else if (c >= 'A' && c <= 'F')
                                      {
                                          result = result * mult + c - 'A' + 10;
                                      }
                                      else break;
                               
                                      c = *s++;
                                  }
                               
                                  result *= sign;
                               
                                  switch (size)
                                  {
                                      case sizeof(UInt8):  *(Int8* )v = (Int8) result; break;
                                      case sizeof(UInt16): *(Int16*)v = (Int16)result; break;
                                      case sizeof(UInt32): *(Int32*)v =        result; break;
                                  }
                              }


                            Немного пояснений:

                            Char* s - строка в которую происходит вывод / из которой считываем
                            void* v - указатель на UInt8/UInt16/UInt32 при переводе в строку / ... на Int8/Int16/Int32 при переводе из строки
                            UInt16 size - задаёт размер "v", т.е. при вызове этот аргумент должен быть sizeof(UInt8)/sizeof(UInt16)/sizeof(UInt32)
                            UInt16 bits - одна из указанных выше констант

                            Пример вызова прямого преобразования (как сделать обратное, надеюсь, догадаешься):

                            ExpandedWrap disabled
                              Char   text[64];
                              UInt32 v = 448165069;  // 0x1AB674CD
                               
                              POSUtils_StrIToAHOB(text, &v, sizeof(UInt32), bits_hex);
                              // в строке наше входное число в шестнадцатиричной форме, т.е. "1AB674CD"
                               
                              POSUtils_StrIToAHOB(text, &v, sizeof(UInt32), bits_bin);
                              // в строке наше входное число в бинарной форме, т.е. "11010101101100111010011001101"
                               
                              POSUtils_StrIToAHOB(text, &v, sizeof(UInt32), bits_oct);
                              // в строке наше входное число в восьмеричной форме, т.е. "3255472315"
                              Denfox777

                              ты прикалываешься или как? :)
                              есть число. и это число можно рассмотреть разными способами. можно как символ (char), можно как число - знаковое/беззнаковое (int/uint), можно как число в шестнадцатеричном виде (hex), можно как последовательность битов (bin).

                              ежели тебе символ нужно отобразить в шестнадцатеричном виде как строку, то юзай sprintf.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0356 ]   [ 15 queries used ]   [ Generated: 19.04.24, 20:29 GMT ]