如果我使用ReadElementContentAsBase64,则file始终为空

时间:2015-05-08 14:27:19

标签: c# xml xamarin.ios base64 xmlreader

我正在使用XmlReader来解析XML文档。其中一个节点包含base64编码数据,我想解码它。这就是我的工作:

var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

但该文件为空,文件大小为0 kB。我也试过这个没有成功:

byte[] buffer = new byte[4096];
int readBytes = 0;
using (FileStream outputFile = File.OpenWrite (path))
using (BinaryWriter bw = new BinaryWriter (outputFile)) {
    while ((readBytes = reader.ReadElementContentAsBase64 (buffer, 0, 4096)) > 0) {
        bw.Write (buffer, 0, readBytes);
    }
}

我不明白。 readBytes 不为空,因此数据在这里。如果我临时将流保存为文件并convert它然后它可以工作(所以我不使用byte[] buffer = new byte[4096]; int readBytes = 0; FileStream outputFile = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write); BinaryWriter bw = new BinaryWriter (outputFile); while ((readBytes = reader.ReadElementContentAsBase64 (buffer, 0, 4096)) > 0) { bw.Write (buffer, 0, readBytes); } outputFile.Close (); )。我在Mac上使用Xamarin Studio,这段代码嵌入到dll中。

我做错了什么或者这是一个错误?我遇到的问题是decoding doesn't work correctly,但是文件是空的?这可能是什么原因?我可以检查什么?

修改

现在我在没有ReadElementContentAsBase64的情况下尝试了它,但文件的大小仍为0 kB。在这里,您可以看到 reader 的实现:

BinaryWriter

3 个答案:

答案 0 :(得分:0)

似乎在Xamarin.iOS上有一些broken(或者至少与Windows上的.Net不一致)ReadElementContentAsBase64。从您的earlier question开始,您的环境中似乎可以使用FromBase64Transform,因此请尝试一下,它会产生与Windows上的ReadElementContentAsBase64算法相同的结果:

        // Advance to the text value of the element.
        if (reader.NodeType == XmlNodeType.Element)
            reader.Read();
        // But make sure there is text value!
        if (reader.NodeType == XmlNodeType.Text)
        {
            var charBuffer = new char[4096];
            using (var fileStream = File.OpenWrite(path))
            using (var transform = new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces))
            using (var cryptoStream = new CryptoStream(fileStream, transform, CryptoStreamMode.Write))
            using (var bufferedStream = new BufferedStream(cryptoStream, charBuffer.Length))
            {
                int charRead;
                while ((charRead = reader.ReadValueChunk(charBuffer, 0, charBuffer.Length)) != 0)
                {
                    for (int i = 0; i < charRead; i++)
                        bufferedStream.WriteByte(checked((byte)charBuffer[i]));
                }
            }
            Debug.WriteLine("Wrote " + path);
        }

答案 1 :(得分:0)

在处理 WRITERS 时,有一种有用的方法 FLUSH ,可将数据发送到基础 STREAM 。我不知道在这种情况下它是否会有所帮助,但值得尝试。

答案 2 :(得分:0)

现在我尝试将文件保存在另一个目录中,但是在旧目录中已经同时写入了。所以我从一开始就经历了我的代码并发现了问题:

XMLReader完成工作后,我在同一条路径上写了一个空字符串。哎哟!

现在文件写得正确,但内容错误(这就是错误)。谢谢所有试图帮助我的人!