СИ. Вывод char на экран в 16-ричном формате...

cDLEON

Онанист РНРСlub
СИ. Вывод char на экран в 16-ричном формате...

PHP:
void
printHexStr(char *str,int len) {
	int i;
	for(i=0; i<len;i++) {
		printf("0x%02x ",str[i]);
	}
	printf("\n");
}
Делаю вот так....Всё вроде бы хорошо...Но иногда выводится что то типа этого:

0x73 0x00 0xffffff90
Чйо не таГ ?
 

fast2111

Новичок
А len действительно соответвует размеру str?
Все ли str определены?

хотя все это странно...

02 - хотя бы 00, но а также больше если есть что выводить...
 

kode

never knows best
Автор оригинала: TutanXamoN
PHP:
void  printHexStr(char* str,int len)
а так?
Как вы думаете, какая разница между вариантами?

cDLEON

Попобуйте
PHP:
#include <string.h>

....

void printHexStr(char *str) { 
    int i; 
    for(i=0; i<strlen(str),i++) { 
        printf("0x%02X ",str[i]); 
    } 
    printf("\n"); 
}
 

cDLEON

Онанист РНРСlub
0x03 0xFFFFFFF6 0x32 0xFFFFFFBD 0x00 0x00 0x00 0x00 0x62 0xFFFFFFFF
=(

-~{}~ 29.02.08 15:30:

Компилятор линуксовый (Fedora 8.0 вроде) gcc
 

Alexandre

PHPПенсионер
кусок моего кода, который из двоичных данных переводит в шеснадцетиричные,
применим к md5 ( исп : md5( input, ilen, output1 ); )
PHP:
static const char c2hex( unsigned char c , unsigned char p){
    unsigned char c1;
        if ( p )
           c1 = c & 15 ; 
        else    
            c1 = c >> 4;

        if ( c1 < 10 ){
            c1 =c1 + 48;
            
            return (char)c1 ;
        }
          else {
               switch (c1)
                {
                    case  10 :
                        return 'a';

                    case  11 :
                        return 'b';
                    
                    case  12:
                        return 'c';
                    
                    case  13:
                        return 'd';
                    
                    case  14:
                        return 'e';
                    
                    case  15:
                        return 'f';
                    
                    default :
                        return '_';
                }
    
            }
    return '_';
}

void md5str( unsigned char *input, int ilen, unsigned char output[32] ){
    unsigned char output1[16];
    unsigned char c;
    int j,i=0;

    md5( input, ilen, output1 );
    for (i=0; i< 16; i++){
        c = output1[i];
        j = (i << 1);

        if (!i){
            output[0]=c2hex(c,1 );
            output[1]=c2hex(c,0 );
        }
        output[j+1]=c2hex(c,1);
        output[j]=c2hex(c,0 );
    }
}
что касательно использования: void printHexStr(char *str) или void printHexStr(char *str, int len), то второй вариант предпочтительней. Многи алгоритмы или структуры уже используют вычесленные ранее длинны строки, по этому, вычислять их повторна - это лишняя трата времени. Читайте Джоэла: "Байты, байты и еще раз байты"
 

cDLEON

Онанист РНРСlub
О. Спасибо. Так - работает
PHP:
void
printHexStr(char *str,int len) {
	int i;
	for(i=0; i<len;i++) {
		printf("0x%c%c ",c2hex(str[i],0),c2hex(str[i],1));
	}
	printf("\n");
}
-~{}~ 29.02.08 15:56:

Есть ещё одно обстаятельство использывания len
В моей строке есть нули. Соответственно при проходе
while(tmp=*str++); цикл прикратиться на много раньше, чем закончится строка....
 

fast2111

Новичок
PHP:
#include <stdio.h>

void printHexStr(char *str, int len) {
    int i;
    for(i=0; i < len; i = i + 1) {
        printf("0x%02x ",str[i]);
    }
    printf("\n");
}

int main() {
    printHexStr("fast", 4);
}
0x66 0x61 0x73 0x74
PHP:
int main() {
    char str[4];
    str[0] = 'f';
    str[1] = 'a';
    str[2] = 's';
    str[3] = 't';
    printHexStr(str, 7);
}
0x66 0x61 0x73 0x74 0x50 0x69 0xffffff8d

Если есть 0x00 то нельзя испольлзовать strlen, а надо заранее знать длину "строки".
Ошибка скорее всего не в функции... и не компиляторе
 

cDLEON

Онанист РНРСlub
fast2111
ну у меня не в конце строки возникает проблема.
Параметр Лен беру от recv
 

kode

never knows best
Код:
 i = i + 1
НА БАШОРК :)

Код:
int main() { 
    char str[4]; 
    str[0] = 'f'; 
    str[1] = 'a'; 
    str[2] = 's'; 
    str[3] = 't'; 
    printHexStr(str, 7); 
}
вы char* и просто char различаете?
 

phprus

Moderator
Команда форума
cDLEON
Странно что твой изначальный код работал не правильно.
Попробуй принтф написать так:
printf("0x%02x ", (unsigned int)str);

-~{}~ 29.02.08 18:22:

Или вообще попробуй переписать функцию так:
Код:
void printHexStr(char *sstr, int len) {
    int i;
    unsigned char *str = (unsigned char *)sstr;
    for(i = 0; i < len; i++) {
        printf("0x%02x ", str[i]);
    }
    printf("\n");
}
 

CatManZero

Новичок
Автор оригинала: phprus
cDLEON
Странно что твой изначальный код работал не правильно.
Попробуй принтф написать так:
printf("0x%02x ", (unsigned int)str);

-~{}~ 29.02.08 18:22:

Или вообще попробуй переписать функцию так:
Код:
void printHexStr(char *sstr, int len) {
    int i;
    unsigned char *str = (unsigned char *)sstr;
    for(i = 0; i < len; i++) {
        printf("0x%02x ", str[i]);
    }
    printf("\n");
}

%x хочет unsigned int, а ему char подсовывают. printf похоже какой-то мусор хватает.
Потому второй вариант скорее всего тоже будет глючить.
 

fast2111

Новичок
0x03 0xFFFFFFF6 0x32 0xFFFFFFBD 0x00 0x00 0x00 0x00 0x62 0xFFFFFFFF

Какая нибудь закономерность при прогонах есть? Т.е. чем то схоже с приведенным выше?
Хотя это не показатель...

В recv вы буффер "определенный" передаете?
Мое мнение - функция в порядке и искать не в ней надо.
 

rotoZOOM

ACM maniac
cDLEON не тормози, сникерсни. phprus
все правильно пишет и у тебя этот код должен корректно работать на всех вменяемых C++ компиляторах.
Причина в том, что в функцию printf ты передаешь char, например 0xff, это считается знаковым char-ом и является -1, а -1 в int (который принимает %x) - это 0xFFFFFFFF для 32 битных компиляторов.
 

phprus

Moderator
Команда форума
cDLEON
И все-таки проверь мой вариант и если не заработает, то скажи чем ты компилируешь. Я попробую у себя воспроизвести такое неправильное поведение кода.
 

cDLEON

Онанист РНРСlub
Да. Я делал в цикле (unsigned char *)
Кстати. У меня компилятор матюкается
include/tools.c:45: warning: initialization makes pointer from integer without a cast
Это как то можно убрать?
Это именна та строка где я делаю преобразование из обычного чара в беззнаковый.
 

phprus

Moderator
Команда форума
cDLEON
Да. Я делал в цикле (unsigned char *)
Ты преобразуешь не из знакового чара в беззнаковый, а в УКАЗАТЕЛЬ на беззнаковый чар.

Тогда уж в цикле надо делать так:
(unsigned char) или (unsigned int)
 

ys

отодвинутый новичок
void printHexStr(char *str, int len) {
int i;
for(i=0; i<len; i++) {
printf("0x%02x ", (unsigned char) str);
}
printf("\n");
}
 
Сверху