wenn du nur einen der 2-3 subs schreiben willst, pflückt man den auch mal auseinander... natürlich automatisiertwer ist schon gerne am bytezählen...
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char getbin (char *hexstr)
{
unsigned char c1,c2 ;
unsigned char x ;
c1 = (unsigned char) *hexstr ;
if ((c1 >= '0') && (c1 <= '9'))
{
c1 -= '0' ;
x = c1 * 16 ;
}
else
{
c1 = tolower (c1) ;
c1 -= 'a' ;
x = (c1+10) * 16 ;
}
hexstr++ ;
c2 = (unsigned char) *hexstr ;
if ((c2 >= '0') && (c2 <= '9'))
{
c2 -= '0' ;
x += c2 ;
}
else
{
c2 = tolower (c2) ;
c2 -= 'a' ;
x += (c2+10) ;
}
return ((char) x) ;
}
void getbinstr (char *buf,int *len,char *out)
{
char *b,*ptr ;
int i,mlen ;
*len = strlen (buf) / 2 ;
if (*len < 4)
mlen = 4 ;
else
mlen = *len ;
b = out ;
ptr = buf ;
for (i = 0 ; i < *len ; i++)
{
b [i] = getbin (ptr) ;
ptr += 2 ;
}
}
unsigned char *gethex (unsigned char c,char *buf)
{
unsigned char i1,i2 ;
char *b ;
b = buf ;
i1 = c / 16 ;
i2 = c - (i1 * 16) ;
if (i1 < 10)
*buf = '0' + i1 ;
else
*buf = 'a' + (i1-10) ;
buf++ ;
if (i2 < 10)
*buf = '0' + i2 ;
else
*buf = 'a' + (i2-10) ;
return ((unsigned char *) b) ;
}
char *gethexstr (unsigned char *data,int len,char *buf)
{
char *ptr ;
ptr = buf ;
while (len)
{
gethex (*data,ptr) ;
data++ ;
len-- ;
ptr += 2 ;
}
*ptr = '\n' ;
*(ptr+1) = 0 ;
return (buf) ;
}
void subemm (char *bin,int geslen,char *out,char *ser,int serlen,int subnum,char *boxid)
{
int sublen,nextsubnum ;
char *thissub,emm [1000],hexbuf [1000],nextboxid [1000],ebuf [1000] ;
emm [0] = (8*16)+2 ;
emm [1] = 7*16 ;
emm [3] = (4*16)+1 ;
memcpy (emm+4,ser,4) ;
emm [8] = 2 ;
emm [9] = 0 ;
emm [11] = 9*16 ;
while ((geslen > 0) && ((geslen - ((unsigned char) *bin)+1) >= 0))
{
sublen = (unsigned char) *bin ;
geslen -= sublen + 8 ;
thissub = bin + 1 ;
nextsubnum = *(bin+sublen+1) ;
memcpy (hexbuf,bin+sublen+2,4) ;
gethexstr ((unsigned char *) hexbuf,4,nextboxid) ;
nextboxid [strlen (nextboxid)-1] = 0 ;
bin += sublen + 8 ;
emm [12] = sublen ;
emm [10] = sublen+2 ;
emm [2] = sublen+10 ;
memcpy (emm+13,thissub,sublen) ;
gethexstr ((unsigned char *) emm,sublen+13,hexbuf) ;
sprintf (out,"BOXID : %s SUBEMM-%d->UNIQUE : %s\r\n",boxid,subnum,hexbuf) ;
out += strlen (out) ;
subnum = nextsubnum ;
strcpy (boxid,nextboxid) ;
}
}
void makefrom07 (char *bin,int len,int emmlen,char *out,char *ser,int serlen)
{
int emmlenges,subnum ;
char boxbin [1000],boxid [1000] ;
if (!ser)
{
ser = bin+4 ;
serlen = 4 ;
}
if ((((unsigned char) bin [0]) != (8*16)+2) || (((unsigned char) (bin [1])) != 7*16))
{
printf ("FEHLER : emm header nicht erkannt\r\n") ;
return ;
}
if (len != ((unsigned char) bin [2]) + 3)
{
printf ("FEHLER : emm länge falsch\r\n") ;
return ;
}
if (((unsigned char) bin [3]) != (4*16)+1)
{
printf ("FEHLER : falscher emmtyp\r\n") ;
return ;
}
if (memcmp (bin+4,ser,4))
memcpy (bin+4,ser,4) ;
if (((unsigned char) bin [8]) != 7)
{
printf ("FEHLER : unknown emm erwartet.\r\n") ;
return ;
}
emmlenges = (unsigned char) bin [9] ;
if (memcmp (bin+12,ser,4))
memcpy (bin+12,ser,4) ;
subnum = (unsigned char) bin [19] ;
memcpy (boxbin,&(bin [20]),4) ;
gethexstr ((unsigned char *) boxbin,4,boxid) ;
boxid [strlen (boxid)-1] = 0 ;
subemm (bin+26,emmlenges-(26-9),out,ser,serlen,subnum,boxid) ;
}
void strip (char *buf)
{
while ((strlen (buf) > 0) && ((buf [strlen (buf)-1] == '\n') || (buf [strlen (buf)-1] == '\r') || (buf [strlen (buf)-1] == ' ')))
buf [strlen (buf)-1] = 0 ;
}
int main (void)
{
char emm [1000],out [3000],ser [1000],bin [1000] ;
int len ;
*ser = 0 ;
printf ("07er emm : ") ;
fflush (stdout) ;
fgets (emm,999,stdin) ;
strip (emm) ;
getbinstr (emm,&len,bin) ;
makefrom07 (bin,len,(unsigned char) bin [2],out,NULL,0) ;
printf ("ausgabe :\n%s\n",out) ;
}
Wir verwenden Cookies und ähnliche Technologien für folgende Zwecke:
Akzeptieren Sie Cookies und diese Technologien?
Wir verwenden Cookies und ähnliche Technologien für folgende Zwecke:
Akzeptieren Sie Cookies und diese Technologien?