Binäre Daten in ein String schreiben



  • Hallo,
    ich möchte binäre Daten verschicken, dazu muss ich diese in ein String reinschreiben. Irgendwie bekomm ich das nicht gebacken. Hab also folgende Varibale:

    char *pBuf;
    

    in dieser stehen dann die binären Daten, die ich von einer Datei ausgelesen habe (bzw. das ist die Datei nur halt binär).
    Genau diese Daten muss ich in einen String schreiben, damit ich es über winsock verschicken kann.


  • Administrator

    Darf ich mal fragen, wieso du 3 Threads aufmachen musst, für eigentlich ein und dasselbe Problem?
    Diesen hier, und folgende zwei:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-157636.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-157641.html

    Grüssli



  • Ich habe gehofft, das vielleicht mir jemand helfen kann, der vielleicht nur das Problem anders geschildert bekommen muss 🙂



  • 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;
    }
    

Anmelden zum Antworten