Это не очень эффективное решение из-за вставок (вероятно, было бы лучше построить строку, добавив 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>