Записать массив File byte[], полученный от C#, в файл в C dll

Я только что создал простой PDF-документ, содержащий слово «Тест», и создал из него поток байтов в консольном приложении С#:

buff = File.ReadAllBytes(<Path of File>);

Размер файла составляет около 9651 байт. Я также создал dll Win32 C, которая экспортирует функцию, которая принимает массив байтов файла и длину массива байтов в качестве аргумента, объявленного в C #, используя это:

[DllImport("<path to dll>", CallingConvention = CallingConvention.Cdecl)] public static extern int file_data(byte[] byteArray, int length);

Метод в C dll экспортируется, как показано ниже:

#define FILEDATA_API __declspec(dllexport) FILEDATA_API int file_data(char *byteArray, int size);

Затем я вызвал ret = file_data(buff, buff.length); и в коде C записал указатель символа, полученный непосредственно во временный файл, символ за символом, как показано ниже:

    while (length> 0)
    {
        fprintf(outFile, "%c", *fileData); //fileData is the actual byte array received from C# Code
        fileData++;
        length--;
    }

Но здесь возникает проблема: код C, который выгружает массив байтов в файл посимвольно, генерирует файл размером 9755 байт. Большая часть содержимого внутри выглядит правильно, за исключением некоторых новых строк, которые вводятся (насколько я знаю, и могут быть некоторые дополнительные данные), что приводит к повреждению файла PDF, и эта выгруженная версия не открывается в Adobe. . Может кто-нибудь, пожалуйста, подскажите, где я могу ошибаться? Я не могу использовать %s in fprint, так как некоторая комбинация массива байтов в PDF приводит к строке с нулевым завершением в C, которая затем выводит даже меньше данных, чем я ожидаю.

Спасибо.

ОБНОВИТЬ:

  1. Желаемое поведение состоит в том, что массив байтов файла, полученный от C# и записанный с использованием кода C в файл, должен обеспечить успешное открытие файла в Adobe.
  2. Кода, представленного в проблеме, должно быть достаточно для того, чтобы кто-то сгенерировал dll win32, который просто записывает указатель char в файл, но я добавил еще несколько деталей.

person learn_develop    schedule 27.11.2015    source источник
comment
Какова сигнатура функции C?   -  person Yacoub Massad    schedule 27.11.2015
comment
В каком режиме вы открываете outFile? Вы пробовали использовать fwrite вместо fprintf?   -  person cbr    schedule 27.11.2015
comment
Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения, в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См.: Как создать минимальный, полный и проверяемый пример.   -  person too honest for this site    schedule 27.11.2015
comment
Это подпись функции C: int file_data(char *byteArray, int size);   -  person learn_develop    schedule 27.11.2015
comment
Я открываю файл в режиме "w", есть ли какие-либо проблемы с использованием fprintf? Я определенно могу попробовать fwrite и посмотреть, сработает ли это.   -  person learn_develop    schedule 27.11.2015
comment
Используйте 1_. См. предпоследний абзац раздела «Параметры» здесь.   -  person cbr    schedule 27.11.2015
comment
Это работает @cubrr :) Какая это была глупая ошибка.   -  person learn_develop    schedule 27.11.2015
comment
это только глупая ошибка, если вы сделаете это снова завтра   -  person Hugh Jones    schedule 27.11.2015


Ответы (1)


Вероятно, вы вызываете fopen без флага режима b. Добавьте b к вашему спецификатору режима:

FILE *outFile = fopen("file.txt", "wb")

С этого сайта (выделено мной):

Текстовые файлы — это файлы, содержащие последовательности строк текста. В зависимости от среды, в которой выполняется приложение, может происходить преобразование некоторых специальных символов в операциях ввода/вывода в текстовом режиме, чтобы адаптировать их к системному формату текстового файла. Хотя в некоторых средах преобразования не выполняются и текстовые и двоичные файлы обрабатываются одинаково, использование соответствующего режима улучшает переносимость.

По моему опыту, это «преобразование» в Windows изменяет как минимум \n на \r\n.

person cbr    schedule 27.11.2015