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.
-
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.htmlGrü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; }