unsigned char

Тема в разделе "WASM.BEGINNERS", создана пользователем blablabla, 4 апр 2010.

  1. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    очень начинающий ~_~
    есть строка unsigned shar, получаю её как выхлоп с одной функции. (~к примеру)
    есть моя char строка, с которой её надо сравнить. как это сделать? язык си. не cpp
    может как то можно просто char в unsigned преобразовать? и уже потом при помощи strcmp сравнить...
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    ууууух... а в чем существенное отличие signed char от unsigned char, как ты думаешь? в плане символов, а не байтов...
     
  3. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    unsigned char гарантированно беззнаковый, а char может быть как знаковым, так и беззнаковым. а char всегда является отдельным типом - он не совпадает ни с signed char, ни с unsigned char. знаю только это
     
  4. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    if (a[0] == (char)b[0]) {...}
    b - unsigned char;

    char это и есть signed char.
     
  5. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    add: это сравнение первого байта, для нескольких соотвественно делай цикл.
     
  6. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    expert
    если не ошибаюсь у борланда умолчания на счет этого задаются в настройках, но вроде бы по умолчанию он все же знаковый. на счет ms не знаю.
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    blablabla
    На самом деле char или знаковый, или беззнаковый, то есть совпадает по поведению или с signed char или с unsigned char. Однако, для языка это три разных типа.
    Что есть "выхлоп"? Рашн, плиз.
    Наверное, имеется ввиду что-то типа:
    Код (Text):
    1. unsigned char* f1();
    2. /* или так: */
    3. void f2( unsigned char* );
    4.  
    5. void f()
    6. {
    7.     char* my_string = "my string";
    8.     if( strcmp( (char*)f1(), my_sring ) == 0 )
    9.     {
    10.         /* blah-blah-blah... */
    11.     }
    12.     unsigned char tmp[256];
    13.     f2( tmp );
    14.     if( strcmp( (char*)tmp, my_string ) == 0 )
    15.     {
    16.         /* blah-blah-blah... */
    17.     }
    18.     char tmp2[256];
    19.     f2( (unsigned char*) tmp2 );
    20.     if( strcmp( tmp2, my_string ) == 0 )
    21.     {
    22.         /* blah-blah-blah... */
    23.     }
    24. }
    что-то типа такого...
    на равно-не равно можно проверять смело, а вот если сравнивать меньше-больше - можно лажануться, тут надо аккуратно.
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    char-не char это 8 bit информации
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    expert
    Не-а... читай стандарт. На m68k, например, char беззнаковый, емнип. Для х86 это пофик, поэтому задается опцией компилера, но по умолчанию - как правило, но не обязательно - таки знаковый.
     
  10. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    у меня dev-cpp т.е. gcc компилятор на виндах
    http://www.polarssl.org/show_source?file=hash/hello
    вот эта программка. мне нужно как то сравнить unsigned char строку digest с моей.
    только есть проблема. в примере выводится в 16-ричном формате, а можно выводить в 10тичном формате при помощи %d.
    какой формат должна иметь строка mydigest чтобы сравнивать с полученной от функции md5?
    т.е. если от md5('Hello, world!') получается 6cd3556debda54bca6b4c39479839 в hex или 10821185109235131657520261176577115257 в dec то это только из за форматного вывода printf
    Какой была строка изначально я не знаю
    вот так код подправил, чтобы в первую (т.е. нулевую) ячейку массива х заносился форматный hex и потом сравнивался с моей строкой mydig
    Код (Text):
    1. /*
    2.  *  Classic "Hello, world" demonstration program
    3.  *  Modified by blablabla [http://wasm.ru/forum/viewtopic.php?id=36948]
    4.  *  Copyright (C) 2006-2009, Paul Bakker <polarssl_maintainer at polarssl.org>
    5.  *  All rights reserved.
    6.  *
    7.  *  Joined copyright on original XySSL code with: Christophe Devine
    8.  *
    9.  *  This program is free software; you can redistribute it and/or modify
    10.  *  it under the terms of the GNU General Public License as published by
    11.  *  the Free Software Foundation; either version 2 of the License, or
    12.  *  (at your option) any later version.
    13.  *
    14.  *  This program is distributed in the hope that it will be useful,
    15.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    16.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    17.  *  GNU General Public License for more details.
    18.  *
    19.  *  You should have received a copy of the GNU General Public License along
    20.  *  with this program; if not, write to the Free Software Foundation, Inc.,
    21.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    22.  */
    23.  
    24. #ifndef _CRT_SECURE_NO_DEPRECATE
    25. #define _CRT_SECURE_NO_DEPRECATE 1
    26. #endif
    27.  
    28. #include <stdio.h>
    29.  
    30. #include "polarssl/md5.h"
    31.  
    32. int main( void )
    33. {
    34.     int i;
    35.     unsigned char x[64];
    36.     char mydig[64]="6cd3556debda54bca6b4c39479839";
    37.     unsigned char digest[16];
    38.     char str[] = "Hello, world!";
    39.  
    40.     printf( "\n  MD5('%s') = ", str );
    41.  
    42.     md5( (unsigned char*) str, 13, digest );
    43.      for( i = 0; i < 16; i++ ) printf( "%x", digest[i] );
    44.      printf( "\n" );
    45.      for( i = 0; i < 16; i++ )
    46.            {printf( "%d", digest[i] );
    47.            };      
    48.      printf( "\n" );
    49.      for( i = 0; i < 16; i++ )
    50.         {
    51.         sprintf( x, "%x", digest[i] );
    52.         if (mydig[i] == (char)x[0] )        
    53.           printf( "lol\n" ); else printf( "-_-\n" );
    54.            
    55.         };      
    56.     printf( "\n\n" );
    57.  
    58. #ifdef WIN32
    59.     printf( "  Press Enter to exit this program.\n" );
    60.     fflush( stdout ); getchar();
    61. #endif
    62.  
    63.     return( 0 );
    64. }
     
  11. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    выводит только 2 совпадения - 1 и 14
     
  12. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    вот только в выше привелённом листинге я всё равно не правильно делаю (~вроде) потому что sprintf добавляет \0 Это ведь совсем не хорошо в моем примере?
    еще поправил, там вобще Unhandled page fault on write access to 0x0000007b at address 0x681cd06f
    хотя, по идее, должно работать
    Код (Text):
    1. /*
    2.  *  Classic "Hello, world" demonstration program
    3.  *
    4.  *  Copyright (C) 2006-2009, Paul Bakker <polarssl_maintainer at polarssl.org>
    5.  *  All rights reserved.
    6.  *
    7.  *  Joined copyright on original XySSL code with: Christophe Devine
    8.  *
    9.  *  This program is free software; you can redistribute it and/or modify
    10.  *  it under the terms of the GNU General Public License as published by
    11.  *  the Free Software Foundation; either version 2 of the License, or
    12.  *  (at your option) any later version.
    13.  *
    14.  *  This program is distributed in the hope that it will be useful,
    15.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    16.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    17.  *  GNU General Public License for more details.
    18.  *
    19.  *  You should have received a copy of the GNU General Public License along
    20.  *  with this program; if not, write to the Free Software Foundation, Inc.,
    21.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    22.  */
    23.  
    24. #ifndef _CRT_SECURE_NO_DEPRECATE
    25. #define _CRT_SECURE_NO_DEPRECATE 1
    26. #endif
    27.  
    28. #include <stdio.h>
    29.  
    30. #include "polarssl/md5.h"
    31.  
    32. int main( void )
    33. {
    34.     int i;
    35.     unsigned char x;
    36.     char nmydig;
    37.     char mydig[64]="6cd3556debda54bca6b4c39479839";
    38.     unsigned char digest[16];
    39.     char str[] = "Hello, world!";
    40.  
    41.     printf( "\n  MD5('%s') = ", str );
    42.  
    43.     md5( (unsigned char*) str, 13, digest );
    44.      for( i = 0; i < 16; i++ ) printf( "%x", digest[i] );
    45.      printf( "\n" );
    46.      for( i = 0; i < 16; i++ )
    47.            {printf( "%d", digest[i] );
    48.            };      
    49.      printf( "\n" );
    50.      for( i = 0; i < 16; i++ )
    51.         {
    52.         sprintf( x, "%x", digest[i] );
    53.         nmydig=mydig[i];  
    54.          if (strcmp((char*)x, nmydig ) == 0)  
    55.           printf( "lol\n" ); else printf( "-_-\n" );
    56.            
    57.         };      
    58.     printf( "\n\n" );
    59.  
    60. #ifdef WIN32
    61.     printf( "  Press Enter to exit this program.\n" );
    62.     fflush( stdout ); getchar();
    63. #endif
    64.  
    65.     return( 0 );
    66. }
     
  13. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    ааап. подскажите, как сделать?
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
  15. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    blablabla

    Перестань свой аватар оправдывать и прочти уж что-то для начала. Ну и подумай.