2010-11-16 6 views
1

Ceci est mon code actuel:Comment convertir en toute sécurité `ToBase64String` en morceaux?

public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     CloseConnection(); 
     using (Stream source = File.Open(DataBaseFileName, FileMode.Open)) 
     { 
      byte[] buffer = new byte[source.Length]; 
      source.Read(buffer, 0, (int)source.Length); 
      writer.WriteString(Convert.ToBase64String(buffer)); 
     } 
     OpenConnection(); 
    } 

Ce que cela fait est une base de données en intégrer un fichier XML (cette méthode appartient à la classe d'un champ dans une autre classe qui est celui en cours de sérialisation). Le problème est que chaque fois que la base de données est d'environ 300 Mo, j'obtiens une exception OutOfMemory sur la ligne byte[] buffer = new byte[source.Length];. Donc je pense que j'ai besoin de le faire sur des morceaux. Mais je ne suis pas sûr de savoir comment cela serait. Je pense que ces morceaux devraient être d'une taille particulière. Aussi, je pense que Convert.ToBase64String ajoutera deux symboles "==" à la fin de la chaîne, donc je devrai probablement les effacer à chaque fois jusqu'à la dernière.

+1

Pourquoi êtes-vous convertir un fichier de 300 Mo dans un fichier XML? –

+1

Parce que je le veux. – Juan

+0

Et parce que je veux l'intégrer dans le fichier "Project" où beaucoup d'autres choses sont enregistrées. Je devrais probablement utiliser la sérialisation binaire mais il y a d'autres choses que je dois corriger en premier. – Juan

Répondre

1

trouvé une classe de flux base64: link text

1

base64 sera toujours pad à plusieurs de 4 caractères. Je pense que tant que vous coupez en morceaux de taille N * 4 vous allez bien.

+0

Mauvais chemin, vous voudriez le diviser sur les limites de 3 octets comme ToBase64String va de 3 octets à 4 :) – tyranid

+0

3 caractères avant l'encodage ou 4 après. –

-1

pourquoi ne pas faire:

writer.WriteString(Convert.ToBase64String(File.ReadAllBytes(DataBaseFileName))); 
+0

cela va avoir le même problème. File.ReadAllBytes() retournera un octet [] qui n'est pas différent de celui de la question. – Bryan

3

base64 code pour chaque séquence de 6 bits en un seul caractère. (D'où le nom: 2^6 = 64 caractères possibles.)

4 tels caractères s'alignent donc exactement à 3 octets (24 bits).

En d'autres termes, la taille de vos morceaux doit être un multiple de 3: 3 octets, ou 6 octets ou 300 octets ...

Questions connexes