c# - 如何安全地分块转换 `ToBase64String`?

标签 c# .net serialization

这是我当前的代码:

    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 异常。所以我想我需要分块做。但我不确定那会怎样。我认为这些 block 需要具有特定的大小。另外,我认为 Convert.ToBase64String 会在字符串末尾添加两个“==”符号,所以我可能每次都必须删除它们,直到最后一个。

最佳答案

Base64 将每个 6 位序列编码为一个字符。 (因此得名:2^6 = 64 个可能的字符。)

因此,4 个这样的字符正好对齐 3 个字节(24 位)。

换句话说,你的 block 的大小必须是3的倍数:3字节,或者6字节,或者300字节...

关于c# - 如何安全地分块转换 `ToBase64String`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4197337/

相关文章:

c# - 列表框迭代 WPF

c# - 通过反射获取基类的私有(private)属性/方法

c# - 如何使用 .NET 将字符串附加到从 Blob 派生的 JSON 字符串?

c# - 基于另一个一维数组的 3 维数组快速排序

c# - 如何强制 XmlSerializer 将元素序列化为编译类型的属性?

java - 将序列化对象作为流读取

c# - NHibernate 错误消息 : object references an unsaved transient instance - save the transient instance before flushing

c# - 服务响应异常 : The specified object was not found in the store

c# - 当事件发生时将数据写入 xml 时出现问题

java - 序列化抽象类的问题