Linq to XML(Base64编码)

时间:2009-06-17 21:32:39

标签: xml linq linq-to-xml

我必须将PDF转换为Base64编码并将其写入XML文件中的元素 我有Base64编码的字符串(非常长/大)但是我正在使用的规范说明如下:

已选择此选项,以确保可以无任何可能地显示和验证XML文件 处理原始JPEG文件的原始二进制组合所导致的问题。应显示文件数据 正确地在XML兼容的浏览器中,例如Internet Explorer。数据必须以固定的76个字符行显示,每行用换行符分隔 第一个问题是关于JPEG的位是有效的,如果我使用pdf?

其次不确定如何实现这一点:数据必须以固定的76个字符行显示,每行用换行符分隔。
如何使用Linq to XML实现此目的

2 个答案:

答案 0 :(得分:3)

Convert.ToBase64String(pdfBytes, Base64FormattingOptions.InsertLineBreaks);

答案 1 :(得分:1)

这不是一个非常有效的解决方案,因为插入(通过从编码文件内容中添加76个字符,然后是新行,然后是76个字符,然后再添加一个新行,构建字符串可能会更好。 ..)但它很短并且展示了一般的想法。如果考虑内存使用和性能,可以考虑用直接将字节编码为Convert.ToBase64String()的代码替换StringBuilder调用。

public static XElement BuildNode(Byte[] data, XName tagName, Int32 lineLength)
{
    StringBuilder sb = new StringBuilder(Convert.ToBase64String(data));

    Int32 position = 0;

    while (position < sb.Length)
    {
        sb.Insert(position, Environment.NewLine);
        position += lineLength + Environment.NewLine.Length;
    }

    sb.AppendLine();

    return new XElement(tagName, sb.ToString());
}

例如

String text = "I have got to convert a PDF to a Base64 Encoded " +
              "and write it to a element in a XML file.";

Byte[] data = Encoding.UTF8.GetBytes(text);

StringBuilder sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);

using (var writer = new XmlTextWriter(tw) { Formatting = Formatting.Indented })
{
    XDocument document = new XDocument(BuildNode(data, "Content", 40));

    document.Save(writer);
}

Console.WriteLine(sb.ToString());

打印以下内容。

<?xml version="1.0" encoding="utf-16"?>
<Content>
SSBoYXZlIGdvdCB0byBjb252ZXJ0IGEgUERGIHRv
IGEgQmFzZTY0IEVuY29kZWQgYW5kIHdyaXRlIGl0
IHRvIGEgZWxlbWVudCBpbiBhIFhNTCBmaWxlLg==
</Content>