2010-11-16 40 views
1

這是我當前的代碼:如何安全地將`ToBase64String`分塊轉換?

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(); 
    } 

這樣做是嵌入數據庫到XML文件(該方法屬於類中的字段在另一個類,是一個被序列化)。問題是,無論何時數據庫大約300MB,我都會在byte[] buffer = new byte[source.Length];行上發現OutOfMemory異常。所以我想我需要在大塊上做。但我不確定那會怎樣。我認爲這些塊需要具有特定的尺寸。另外,我認爲Convert.ToBase64String會在字符串的末尾添加兩個「==」符號,所以我可能必須每次擦除它們直到最後一個。

+1

爲什麼你將300 MB文件轉換爲XML文件? – 2010-11-16 18:20:20

+1

因爲我想。 – Juan 2010-11-16 18:46:51

+0

而且因爲我想將它嵌入到保存很多其他東西的「Project」文件中。我應該使用二進制序列化,但還有其他一些事情我必須先解決。 – Juan 2010-11-16 18:50:33

回答

1

base64將始終填充4個字符的倍數。我認爲只要你用N * 4大小的塊切割,你就很好。

+0

錯誤的解決方法是,您需要將它分割爲3個字節的邊界,因爲ToBase64String從3個字節變爲4個:) – tyranid 2010-11-16 21:28:22

+0

3個字符在編碼之前或4個之後。 – 2012-10-10 22:51:39

-1

爲什麼不在:

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

這將會有相同的問題。 File.ReadAllBytes()將返回一個字節[],它與問題中沒有任何區別。 – Bryan 2010-11-16 21:26:30

3

Base64編碼的6個比特的每個序列編碼成一個字符。 (因此名稱:2^6 = 64個可能的字符)。

4個這樣的字符因此準確對準3個字節(24位)。

換句話說,你的塊的大小必須是3的倍數:3個字節,或6個字節,或300個字節...

相關問題