我刚刚创建了一个简单的 PDF 文档,其中包含一个单词“Test”,并在 C# 控制台应用程序中创建了一个字节流:
buff = File.ReadAllBytes(<Path of File>);
该文件的大小约为 9,651 字节。我还创建了一个 Win32 C dll,它导出一个函数,该函数将文件字节数组和字节数组的长度作为参数,在 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 代码会生成一个大小为 9,755 字节的文件。它里面的大部分内容看起来都是正确的,除了一些被引入的新行(据我所知,可能是一些额外的数据),这会导致 PDF 文件损坏并且这个转储的版本无法在 Adobe 中打开. 有人可以提供一些关于我可能出错的地方吗?我不能使用%s in fprint
,因为 PDF 中字节数组的某些组合会导致 C 中以空字符结尾的字符串,然后转储出比我预期的更少的数据。
谢谢。
更新:
- 所需的行为是从 C# 接收的文件字节数组以及使用 C 代码写入文件时应该使文件在 Adobe 中成功打开。
- 问题中存在的代码应该足以让某人生成一个 win32 dll,它只是写出指向文件的 char 指针,但我添加了更多细节。