?
Du musst Sonderzeichen wie 0 in Texte umwandel: z.B. "\x000"
Ich hab dadür zwei Funktionen memtostr und strtomem :
#define STR_NOMARKS 0x00000001 // Keine Anführungszeichen
#define STR_REGMODE 0x00000002 // Sezialzeichen sind : \" \\ \n \r
//****************************************************************************
//*
//* memtostr
//*
//****************************************************************************
// Wandeld einen Memory-Bereich in einen String um
// Zeichen < 32 werden in /x??? umgewandelt
// Len ist die Größe des Mem-Speichers
// Str_max die Größe des Str-Speichers
// Art: STR_NOMARKS Keine Anführungszeichen einfügen
// STR_REGMODE Sezialzeichen sind : \" \\ \n \r
// Ergibt die Länge des Strings
int _cdecl memtostr(char *Str,int Str_max,const void *Mem,int Len,int Art)
{
int len=0,gesamt;
unsigned char byte,*mem=(unsigned char*)Mem;
gesamt=Str_max;
if(Art&STR_NOMARKS) // Am Anfang kein Anfürungs-Zeichen
{
Str_max+=2;
}
else{
if(Str_max>=2) // Am Anfang ein Anfürungs-Zeichen
{
*Str='\"';
Str_max--;
Str++;
}
}
while(len<Len)
{
if(Str_max<=2)break;
byte=mem[len];len++;
if((byte>=32)&&(byte!='\"')&&(byte!='\\'))
{
*Str=byte;
Str_max--;
Str++;
continue;
}
if(Str_max<=4)break; // Zuwenig freier Speicher ?
*Str='\\';
Str_max--;
Str++;
if(byte=='\\'){*Str='\\';Str_max--;Str++;continue;}
if(byte=='\"'){*Str='\"';Str_max--;Str++;continue;}
if(byte=='\r'){*Str='r' ;Str_max--;Str++;continue;}
if(byte=='\n'){*Str='n' ;Str_max--;Str++;continue;}
if(~Art&STR_REGMODE)
{
if(byte=='\''){*Str='\'';Str_max--;Str++;continue;}
if(byte=='\t'){*Str='t' ;Str_max--;Str++;continue;}
if(byte=='\a'){*Str='a' ;Str_max--;Str++;continue;}
if(byte=='\b'){*Str='b' ;Str_max--;Str++;continue;}
if(byte=='\f'){*Str='f' ;Str_max--;Str++;continue;}
if(byte=='\v'){*Str='v' ;Str_max--;Str++;continue;}
}
if(Str_max<=6)break;
Str[0]='x' ;
Str[1]='0' ;
Str[2]="0123456789ABCDEF"[byte>> 4];
Str[3]="0123456789ABCDEF"[byte&0x0F];
Str+=4;
Str_max-=4;
}
if(Art&STR_NOMARKS)Str_max-=2;
else{
if(Str_max>=2) // Am Ende ein Anfürungs-Zeichen
{
*Str='\"';
Str_max--;
Str++;
}
}
if(Str_max)*Str=0;
return gesamt-Str_max;
}
//*****************************************************************************
//*
//* strtoc
//*
//*****************************************************************************
// Wandeld String in Zeichen um z.B. "/t" wird zu 9
// Ergibt das Zeichen
int _cdecl strtoc(const char *Str,int *Len)
{
int x;
char zeichen,zahl;
zeichen=*Str;
if(zeichen=='\\')
{
if(Len)*Len=2;
zeichen=Str[1];
if(zeichen=='\\')return '\\';
if(zeichen=='\"')return '\"';
if(zeichen=='\'')return '\'';
if(zeichen=='?' )return '?' ;
if(zeichen=='t' )return '\t';
if(zeichen=='r' )return '\r';
if(zeichen=='n' )return '\n';
if(zeichen=='a' )return '\a';
if(zeichen=='b' )return '\b';
if(zeichen=='f' )return '\f';
if(zeichen=='v' )return '\v';
if(zeichen=='x' || zeichen=='X') // Hex-Zahl
{
for(zahl=0,x=2;x<5;x++)
{
zeichen=Str[x];
if( zeichen>='a') zeichen-=32; // Klein zu Groß
if((zeichen< '0')||(zeichen>'F'))break;
if((zeichen> '9')&&(zeichen<'A'))break;
zeichen-=(zeichen<'A')? '0':'A'-10; // Wert berechen
zahl<<=4; // Zahl berechen
zahl+=zeichen;
}
if(x>=2)
{
if(Len)*Len=x;
return zahl;
}
}
else{ // Oktal Zahl
for(zahl=0,x=1;x<4;x++)
{
zeichen=Str[x];
if(zeichen<'0')break;
if(zeichen>'7')break;
zahl<<=3; // Zahl berechen
zahl+=zeichen-'0';
}
if(x>1)
{
if(Len)*Len=x;
return zahl;
}
}
if(Len)*Len=1;
return '\\';
}
if(Len)*Len=1;
return zeichen;
}
//****************************************************************************
//*
//* strtomem
//*
//****************************************************************************
// Wandeld einen String in einen Memory-Bereich um
// Spezial Zeichen wie // /n /r /b /a /0 /x werden berücksichtigt
// Len ist die maximale Größe des Mem-Speichers
// Fängt Str mit '"' an so werden nur die Zeichen zwischen den
// Anführungszeichen ausgewärtet, ist in Len das Bit 0x40000000 gesetz
// so werden Anführungszeichen nicht berücksichtigt.
// In *Count wird die Anzhal der verarbeiteten Byte aus Str gespeichert
// Ergibt die Länge des Mem-Bereiches
int _cdecl strtomem (void *Mem,int Len,const char *Str,int *Count)
{
int anz,len=0,stop=0;
char zeichen,*mem=(char*)Mem;
const char *anf=Str;
if(*Str=='\"' && ~Len&0x40000000) // Anführungs-Zeichen
{
stop=1;Str++;
}
Len&=~0x40000000;
while(len<Len)
{
zeichen=*Str;
if(!zeichen)break;
if( zeichen=='\"' && stop ){Str++;break;}
if( zeichen=='\\') // Escape Sequenzen
{
mem[len]=strtoc(Str,&anz);
Str+=anz;len++;
continue;
}
mem[len]=zeichen;
Str++;len++; // Spezial Zeichen
}
if(Count)
{
*Count=Str-anf;
}
return len;
}