[an error occurred while processing this directive]
для аврки это выглядело так(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено F8 16 января 2006 г. 17:53
В ответ на: Не будутли так любезны, много уважаемые джины, поделиться сикретом кодирования раскодирования сверх сикретного формата PDU, под С++ или Delphi отправлено <font color=gray>TamTam 1</font> 16 января 2006 г. 17:28


сначала модуль на асме ну неудобно на C строки на бит сдвигать:)
MODULE StrSHLSHL

PUBLIC ShlStr
PUBLIC HexStrToStr
PUBLIC HexToChar
PUBLIC HexToLong
PUBLIC StrToDec
PUBLIC DecToStr

RSEG CODE:CODE
; __nearfunc void ShlStr(char *, unsigned char);

ShlStr:
movw r30,r16

ld r16,Z
clc
sbrc r16,7
sec
andi r16,0x7F
st Z+,r16
tst r18
rjmp ShlStr2
ShlStr1:
ld r16,Z
rol r16
st Z+,r16
dec r18
ShlStr2:
brne ShlStr1
ret


HexToChar:
movw r30,r16

HexToChar1:
ld r16,Z+
ld r17,Z+

subi r16,0x30
sbrc r16,4
subi r16,7
swap r16

subi r17,0x30
sbrc r17,4
subi r17,7

or r16,r17
ret

HexToLong:
movw r30,r16
rcall HexToChar1
mov r19,r16;
rcall HexToChar1
mov r18,r16
rcall HexToChar1
mov r20,r16
rcall HexToChar1
mov r17,r20
ret

HexStrToStr:
push r26
push r27

movw r26,r16
movw r30,r16
tst r18
rjmp HexStrToStr2

HexStrToStr1:
rcall HexToChar1
st X+,r16

dec r18
HexStrToStr2:
brne HexStrToStr1

pop r27
pop r26
ret

StrToDec:
movw r30,r16

ld r16,Z+
andi r16,0x0F;

ld r17,Z+

mov r18,r17
andi r18,0xF0
cpi r18,0x30
brne StrToDec1

andi r17,0x0F

swap r16;
or r16,r17
StrToDec1:
ret;

DecToStr:
movw r30,r16

mov r16,r18
andi r16,0xF0
tst r16
breq DecToStr1
swap r16
ori r16,0x30
st Z+,r16
DecToStr1:
andi r18,0x0F
ori r18,0x30
st Z+, r18

ldi r16,0
st Z+,r16

ret

ENDMOD
END

и на C
extern char HexToChar(char* HexStr);
extern void HexStrToStr(char* str, unsigned char len);
extern void ShlStr(char* str, unsigned char len);
extern long HexToLong(char* SMS);


void PDUToStr(char* PDU, unsigned char len)
{/*ïåðâûå 2 áàéòà êîë-âî ñèìâîëîâ â hex ôîðìàòå*/
HexStrToStr(PDU,len - len/8);

while(len--)
{
ShlStr(PDU++,len);
}
*PDU=0;
}
char* ConvertNum(char* Num, unsigned char len)
{
char* result;
char tmp1;
char tmp2;

len>>=1;

if(*Num == '9')
{*++Num = '+';} else {Num++;}
Num++;

result = Num;
while(len--)
{
tmp2 = *Num;
tmp1 = *(Num+1);
*(Num++)=tmp1;
if(tmp2 == 'F')break;
*(Num++)=tmp2;
}
*Num = 0;
return(result);
}

//сторка с SMS находится в rx_buffer0
char SMSDecode(void)
{
char *SMS;
unsigned char tmp;
asm("cli");
SMS = rx_buffer0;
tmp = (HexToChar(SMS)<<1)+4;
SMS +=tmp;
tmp = HexToChar(SMS);
if(tmp & 1)tmp++;
if((tmp > 15)||(tmp < 4))return 0;
SMS+=2;
strcpy(SMSdec.PhoneNum, ConvertNum(SMS, tmp));
SMS+= tmp+20;
tmp = HexToChar(SMS);
if(tmp != 16)return 0;
SMS+=2;
PDUToStr(SMS,tmp);
//SMSdec.num = HexToLong(SMS);
//SMS+=8;
//SMSdec.cod = HexToLong(SMS);
asm("sei");
return 1;
}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru