На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> ... , даже не знаю как объяснить...
    Короче... у меня есть 2 буффера.

    xCHR[2];
    cCHR[1];

    в xCHR лежит 0x62, 0x65 (т.е. BE). Можно ли положить как-нибудь в сСHR 0xBE, используя sprintf(или как-нибудь еше) ??
      Цитата 0xBAD,8.02.04, 18:43
      Короче... у меня есть 2 буффера.

      xCHR[2];
      cCHR[1];

      в xCHR лежит 0x62, 0x65 (т.е. BE). Можно ли положить как-нибудь в сСHR 0xBE, используя sprintf(или как-нибудь еше) ??

      ExpandedWrap disabled
        char cTmp[ sizeof( xCHR ) + 1 ], *pcTst;
        unsigned long ulBIN;
         
        memcpy( cTmp, xCHR, sizeof( xCHR ) );
        cTmp[ sizeof( xCHR ) ] = '\0';
         
        ulBIN = strtoul( cTmp, &pcTst, 16 );
        if( pcTst == &cTmp[ sizeof( xCHR ) ] ) //вроде так
         cCHR[ 0 ] = ulBIN;
        ExpandedWrap disabled
           
          char* tmp;
          cCHR[0] = strtoul(xCHR, &tmp, 16);
          У меня кое-что не получается.

          char xDATA[32];
          char cDATA[16];

          В xDATA строка 12932c8ab5с28ba9fcc8da4721f4d5d1.

          for (i = 0; i < 16; i++)
          {
          chr[0] = xDATA[i*2];
          chr[1] = xDATA[i*2+1];
          cDATA[i] = (BYTE)strtoul(chr, NULL, 16);
          }

          Так все работает.

          for (i = 0; i < 16; i++)
          {
          cDATA[i] = (BYTE)strtoul(&xDATA[i*2], NULL, 16);
          }

          А так почему-то нет. Мне этот вариант больше нравится.
            Все правильно. Второй вариант преобразовывает всю строку символов (начиная от xDATA + i * 2 до завершающего нуля), а первый - только очередные два символа из строки. Как говориться, "почувствуйте разницу"...

            Добавлено в :
            Да, кстати, лучше, всеж таки, так:
            ExpandedWrap disabled
               
              for (i = 0; i < 16; i++)
              {
                 chr[0] = xDATA[i*2];
                 chr[1] = xDATA[i*2+1];
                 chr[2] = 0;
                 cDATA[i] = (BYTE)strtoul(chr, NULL, 16);
              }
              Цитата
              Все правильно. Второй вариант преобразовывает всю строку символов (начиная от xDATA + i * 2 до завершающего нуля), а первый - только очередные два символа из строки. Как говориться, "почувствуйте разницу"...


              1. Во втором варианте у меня нет завершающего нуля.
              2. Тогда почему и в этом случае все работает, хотя 4 байта?

              сhar chr[4];

              for (i = 0; i < 16; i++)
              {
              chr[0] = xDATA[i*2];
              chr[1] = xDATA[i*2+1];
              chr[2] = 0x51;
              chr[3] = 0x11;
              cDATA[i] = (BYTE)strtoul(chr, NULL, 16);
              }
                Потому что в стеке после chr может оказаться ноль. Это раз. Второе - в предыдущем примере у тебя в strtoul передается строка, котороая не может быть корректно преобразована в число (слишком длинная).
                А о завершающих нулях ге забывай.
                  А есть какая-нибудь strtoub ?? :)
                    А зачем? Главное - все аккуратно делать.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0263 ]   [ 16 queries used ]   [ Generated: 1.05.24, 08:48 GMT ]