我刚刚创建了一个简单的PDF文档,其中包含一个单词“Test”,并在C#控制台应用程序中创建了一个字节流:buff = File.ReadAllBytes(<Path of File>);
文件大小约为9651字节我还创建了一个Win32 C dll,该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代码生成9755字节大小的文件它里面的大部分内容看起来都是正确的,除了一些新的行被引入(据我所知,可能是一些额外的数据),这会导致PDF文件损坏,并且这个被转储的版本不会在Adobe中打开有人能告诉我哪里可能出错吗我不能使用
%s in fprint
,因为PDF中字节数组的某些组合会导致C中以空结尾的字符串,然后该字符串会转储比我预期的更少的数据。谢谢。
更新:
所需的行为是从C接收的文件字节数组#
当使用C代码写入文件时,应该使文件打开
在Adobe中成功。
出现问题的代码应该是
足以让某人生成一个win32 dll,它只需编写
出了指向一个文件的char指针,但是我添加了一些细节。
最佳答案
您可能正在调用没有模式标志的fopen
将b
附加到模式说明符:
FILE *outFile = fopen("file.txt", "wb")
来自this site(强调我的):
文本文件是包含文本行序列的文件根据应用程序运行的环境,在文本模式下的输入/输出操作中可能会发生一些特殊字符转换,以使它们适应特定于系统的文本文件格式尽管在某些环境中不会发生转换,并且文本文件和二进制文件的处理方式相同,但使用适当的模式可以提高可移植性。
以我的经验,Windows上的这个“转换”至少将
b
更改为\n
。关于c - 从C#接收到的文件byte []数组写入C dll中的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33957933/