无法从字节数组解码文档以写入文件

时间:2014-10-02 14:45:29

标签: c# base64 bytearray memorystream

我正在从SAP系统中检索一个byte []并尝试将数组解码回源文件格式(pdf,text,jpg或doc)。但是,在多次尝试之后,打开新创建的临时文件时,文件内容是编码值(我正在使用文本文件进行测试)。

我正在使用的代码是返回一个创建对象的路径,我的方法在下面。

private string DecodeFromBytes(byte[] fileContents)
    {
        DocumentFilePath = System.IO.Path.GetTempFileName();
        //FileStream tempFile = File.OpenWrite(DocumentFilePath);

        string bytesString = Convert.ToBase64String(fileContents);

        // Used for Checking.
        // This is the exact same as the passed fileContents value. 
        byte[] convertedBytes = Convert.FromBase64String(bytesString);

        MemoryStream ms = new MemoryStream(convertedBytes, 0, convertedBytes.Length);

        ms.Write(convertedBytes, 0, convertedBytes.Length);

        using (FileStream tempFile = new FileStream(DocumentFilePath, FileMode.Create, FileAccess.Write))
        {
            //byte[] tempBytes = new byte[ms.Length];
            //tempFile.Write(convertedBytes, 0, convertedBytes.Length);
            ms.WriteTo(tempFile);
        }

        //tempFile.Write(fileContents, 0, fileContents.Length);
        //tempFile.Close();

        return DocumentFilePath;
    }

保存的编码文本也不合适;有落后的“A”。我猜是在空字节上填充?下面是返回的内容,以及返回的内容。

编码文本

  

TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gSW50ZWdlciBuZWMgb2Rpby4gUHJhZXNlbnQgbGliZXJvLiANClNlZCBjdXJzdXMgYW50ZSBkYXBpYnVzIGRpYW0uIFNlZCBuaXNpLiBOdWxsYSBxdWlzIHNlbSBhdCBuaWJoIA0KZWxlbWVudHVtIGltcGVyZGlldC4gRHVpcyBzYWdpdHRpcyBpcHN1bS4gUHJhZXNlbnQgbWF1cmlzLiANCkZ1c2NlIG5lYyB0ZWxsdXMgc2VkIGF1Z3VlIHNlbXBlciBwb3J0YS4gTWF1cmlzIG1hc3NhLiBWZXN0aWJ1bHVtIGxhY2luaWEgYXJjdSBlZ2V0IG51bGxhLiANCkNsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQgbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgDQpwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBDdXJhYml0dXIgc29kYWxlcyBsaWd1bGEgaW4gbGliZXJvLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

文件应该读什么

  

Lorem ipsum dolor坐下来,精神上的精神。整数nec odio。 Praesent libero。   Sed cursus ante dapibus diam。塞德尼斯。 Nulla quis sem at nibh   元素不安全。 Duis sagittis ipsum。 Praesent mauris。   Fusce nec tellus sed augue semper porta。 Mauris massa。 Vestibulum lacinia arcu eget nulla。   每个conubia nostra的类别taciti sociosqu ad litora torquent,   每个inceptos himenaeos。在libero中,Curabitur sodales ligula。

我很肯定我忘记了一步,我只是不知道在哪里。任何帮助/提示将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

这些'A'字符等于0.看起来你的fileContents数组长度为510字节,尾随零。这是一个复制问题的代码:

var str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. 
Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh 
elementum imperdiet. Duis sagittis ipsum. Praesent mauris. 
Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, 
per inceptos himenaeos. Curabitur sodales ligula in libero.";
// str's length is much lower
var bytes = new byte[510];
Encoding.UTF8.GetBytes(str, 0, str.Length, bytes, 0);
// Value of output is exactly the same as yours
var output = Convert.ToBase64String(bytes);

但是这段代码会给你一个预期的结果:

var str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. 
Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh 
elementum imperdiet. Duis sagittis ipsum. Praesent mauris. 
Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, 
per inceptos himenaeos. Curabitur sodales ligula in libero.";
var bytes = Encoding.UTF8.GetBytes(str);
var output = Convert.ToBase64String(bytes);