Проблемы с декодированием документов из массива байтов для записи в файл

Я извлекаю byte[] из системы SAP и пытаюсь декодировать массив обратно в формат исходного файла (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 sit amet, consectetur adipiscing elit. Целое без исключения. Настоящий либеро. Sed cursus ante dapibus диам. Сед ниси. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Презент Маурис. Fusce nec tellus sed augue semper porta. Маурис Масса. Vestibulum lacinia arcu eget nulla. Class aptent taciti socialsqu ad litora Torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero.

Я уверен, что забыл шаг, я просто не знаю, где. Любая помощь/подсказки будут оценены.

Спасибо.


person Jake_TheCoder    schedule 02.10.2014    source источник
comment
Трудно сказать, почему вы вообще конвертируете в base64. Почему вы просто не используете File.WriteAllBytes(DocumentFilePath, fileContents)?   -  person Jon Skeet    schedule 02.10.2014
comment
Я перехожу на Base64, чтобы пользователь мог просматривать выбранный файл в приложении WPF. используя File.WriteAllBytes(DocumentFilePath, fileContents), я все еще возвращаю то же самое, что и закодированный текст выше.   -  person Jake_TheCoder    schedule 02.10.2014
comment
Но вы не используете версию base64, кроме как для преобразования обратно в байты...   -  person Jon Skeet    schedule 02.10.2014
comment
@JonSkeet, ты прав. Вот почему я чувствую, что гоняюсь за своим хвостом! Что я делаю неправильно, пытаясь записать байты в читаемый текстовый файл?   -  person Jake_TheCoder    schedule 02.10.2014
comment
Если ваш текущий код записывает версию с кодировкой base64, то это звучит так, как будто вам передается in версия с кодировкой base64.   -  person Jon Skeet    schedule 02.10.2014
comment
@JonSkeet, ты абсолютно прав! Я вернулся к своему исходному коду SAP, и в передаваемых параметрах использовалась функция code 'SSFC_BASE64_ENCODE'. Это объясняет погоню за хвостом.   -  person Jake_TheCoder    schedule 02.10.2014


Ответы (1)


Эти символы «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);
person Eldar Dordzhiev    schedule 02.10.2014
comment
Ваш код дает мне правильную строку Base64 и устраняет эти надоедливые следы. Теперь я пытаюсь понять, как сохранить байты в читаемый текстовый файл (или pdf, если необходимо). - person Jake_TheCoder; 02.10.2014
comment
@sithlordjake Я вообще не уверен в том, что ты пытаешься сделать. Ваш метод называется DecodeFromBytes(), но на самом деле он кодирует fileContents в base64. - person Eldar Dordzhiev; 02.10.2014
comment
Я считаю, что у меня туннельное зрение. То, что я пытаюсь сделать, это получить байт [] и записать байты во временный файл для целей отображения и иметь возможность просматривать его правильно (т. е. текст в текст, изображение в изображение, pdf в pdf). Я использую этот метод для создания временного URL-адреса для просмотра моего объекта. Двумя другими параметрами объекта являются расширение файла и заголовок. - person Jake_TheCoder; 02.10.2014
comment
Кажется, это работает, используя предоставленный вами пример. code FileStream fs = новый FileStream(DocumentFilePath, FileMode.Create, FileAccess.Write, FileShare.None); fs.Write(выход, 0, вывод.Длина); фс.Закрыть(); Я предполагаю, что проблема с пустыми байтами. Казалось бы, SAP добавляет 0, чтобы дополнить массив. Я попробую зациклиться или скопировать массив и обрезать неправильные нули. - person Jake_TheCoder; 02.10.2014