Maximale grösse von AnsiString



  • hallo

    was ist die wirkliche maximal mägliche grösse eines AnsiString? ich habe das problem, dass ich base64 kodierte dateien ab einer gewissen grösse nicht mehr in einen AnsiString packen kann. was sollte ich stattdessen verwenden?

    und was ist die maximale grösse eines char* (müsste AnsiString ja prinzipiel sein)? weil dort lese ich eine datei komplett ein und diese kann durchaus 5-50mb sein. siehe:

    TFileStream *File = new TFileStream(filepath, fmOpenRead);
    	unsigned int in_len = File->Size;
    	char *bytes = new char[in_len]; //wie gross maximal?
    
    	File->Seek(0, soFromBeginning);
    	File->Read(bytes, in_len);
    


  • Hallo

    char* und AnsiString können so groß sein wie der größte von Windows lieferbare zusammenhängende Speicherbereich. 50 Megabyte sollten da auf heutigen Rechnern kein Problem sein.

    bis bald
    akari



  • hallo akari und danke für dein posting. das dachte ich eigentlich auch. aber ab einer grösse klappt es komischerweise nicht mehr. hier der base64 kodierungs code, vielleicht siehst du ja dort ein problem:

    //---------------------------------------------------------------------------
    std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    						   "abcdefghijklmnopqrstuvwxyz"
    						   "0123456789+/";
    //---------------------------------------------------------------------------
    static inline bool is_base64(unsigned char c)
    {
    	return (isalnum(c) || (c == '+') || (c == '/'));
    }
    //---------------------------------------------------------------------------
    String Base64Encode(String filepath)
    {
    	TFileStream *File = new TFileStream(filepath, fmOpenRead);
    	unsigned int in_len = File->Size;
    	char *bytes = new char[in_len];
    	unsigned char const* bytes_to_encode = bytes;
    
    	File->Seek(0, soFromBeginning);
    	File->Read(bytes, in_len);
    
      String ret;
      int i = 0;
      int j = 0;
      unsigned char char_array_3[3];
      unsigned char char_array_4[4];
    
      while (in_len--) {
        char_array_3[i++] = *(bytes_to_encode++);
        if (i == 3) {
          char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
          char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
          char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
          char_array_4[3] = char_array_3[2] & 0x3f;
    
          for(i = 0; (i <4) ; i++)
            ret += base64_chars[char_array_4[i]];
          i = 0;
        }
      }
    
      if (i)
      {
        for(j = i; j < 3; j++)
          char_array_3[j] = '\0';
    
        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;
    
        for (j = 0; (j < i + 1); j++)
          ret += base64_chars[char_array_4[j]];
    
        while((i++ < 3))
          ret += '=';
    
      }
    	delete File;
    	delete[] bytes;
      return ret;
    
    }
    


  • burpy schrieb:

    char *bytes = new char[in_len];
    

    M.E. ist dein char-Array zu klein, da fehlt ein Byte für die Null-Terminierung.



  • danke jansen für den hinweis. also scheinbar gibt es kein problem mit den variablen, sondern vielmehr bei der übertragung. ich sende das ganze dann mit THTTPRIO an einen SOAP Server. gibt es vielleicht dabei, also mit THTTPRIO ein problem mit datengrössen, von dem ich nichts weiss?



  • ich habe erfahren das es so gehen soll:

    rio->HTTPWebNode->MaxSinglePostSize = XYZ;
    

    aber MaxSinglePostSize gibt es scheinbar für den C++ Builder 6 nicht. wie kann ich nun verhindern, das dass datenpacket gesplittet wird?



  • keine idee? :xmas2:



  • Hallo

    Im schlimmsten Fall den Builder updaten, um die versprochene Lösung anwenden zu können.

    bis bald
    akari


Anmelden zum Antworten