WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Проблема преоброзования (need HELP)

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Проблема преоброзования (need HELP)
klep опубликован 16-02-2002 20:22 MSK   Click Here to See the Profile for klep   Click Here to Email klep  
необходимо преоброзовать одну строку в другую

входная строка:
char mas4[]={"65746F74657374"};
необходимо получить ={"etotest"};
проблема в том что если встречается число
типа 6F то раскладывается :
cимвол '6' = 0x36
символ 'F' = 0x46
ну и остаток от деления соответственно 66.

может есть другие способы реализации ?

как я делал:
#include<stdio.h>
#include<iostream.h>


char mas4[] = {"65746F74657374"}; //etotest
int mas2[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};

char ascii[256];

void main(void)
{
int i,j;
char a,c;
int p;

char *mas3 = new char[100];

for(i=0;i<256;++i) {ascii[i]=i;}


for(i=0,j=0;i<(int)strlen(mas4);++i,j++)
{

a = mas4[i]%16;
c = mas4[++i]%16;
p = mas2[a] * 16 + mas2[c];

mas3[j] = p;

cout << mas3[j];

}

mas3[j+1]='\0';

cout << flush;


delete [] mas3;
}


Valery опубликован 16-02-2002 21:17 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
сразу настораживает массив содержимое которого соответствует индексам этого же массива. я про mas2 - нафиг он?
Valery опубликован 16-02-2002 21:58 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
эх, молодежь...
чтоб совсем не обленились вот такого кусочка хватит?
int hex_digit_to_int(char ch)
{
return ch - ((ch > '9')? 'A' - 10 : '0');
}
вместо чего вставить - это уж сам.
конечно у функции куча недостатков и ограничений, но с этим набором данных она справится.
rivitna опубликован 17-02-2002 15:16 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
А я б на ASM'е написал, потому что проще и есть замечательная инструкция xlat:

static char ascii[256]; // таблица ascii символов

int HexStr2Str(char *pzDest, char *pzSrc)
{
__asm
{
mov esi,[pzSrc]
mov edi,[pzDest]
lea ebx,[ascii]

charloop:
lodsb
or al,al
jz done

sub al,30h
cmp al,9
jbe L1
sub al,7
L1:
mov ah,al

lodsb
sub al,30h
cmp al,9
jbe L2
sub al,7
L2:

shl ah,4
add al,ah
xlatb
stosb
jmp charloop

done:
mov BYTE PTR [edi],0
mov eax,edi
sub eax,[pzDest]
}
}

pzDest -> буфер для преобразованной строки
pzSrc -> исходная строка типа "65746F74657374"

Функция возвращает количество символов, записанных в pzDest.

ЗЫ: Вроде работает! :)
Только смущает меня то обстоятельство, что компилятор не понял более простой и эффективной команды процессора
aad 10h,
которая заменяет две команды:
shl ah,4
add al,ah :(

sps опубликован 18-02-2002 12:31 MSK     Click Here to See the Profile for sps  Click Here to Email sps     
Это тоже работает и мне кажется проще.
char sz[] = "65746F74657374", *pszResult = new char[strlen(sz) + 1], temp[3] = "";

for (unsigned int ui = 0; sz[ui<<1] != 0; ui++)
{
temp[0] = sz[ui<<1], temp[1] = sz[(ui<<1)+1];
pszResult[ui] = strtol(temp, NULL, 16);
}
pszResult[ui] = 0;

printf("%s\n", pszResult);
delete [] pszResult;

Valery опубликован 18-02-2002 15:31 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2sps:
Вот ведь заклинило, помнил же, что обратная функция для _ltoa была, но напрочь забыл какая! накарябал сам. спасибо напомнил.
вот только зачем же сдвиг тут применять? умножение на 2 выглядело бы нагляднее, тем более в кодах бы в одно и то же вылилось.
klep опубликован 18-02-2002 15:58 MSK     Click Here to See the Profile for klep  Click Here to Email klep     
Большое спасибо.

я и забыл про strtol.
Очень просто и эффективно.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.