2

我刚刚创建了一个简单的 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 文件损坏并且这个转储的版本无法在 Adob​​e 中打开. 有人可以提供一些关于我可能出错的地方吗?我不能使用%s in fprint,因为 PDF 中字节数组的某些组合会导致 C 中以空字符结尾的字符串,然后转储出比我预期的更少的数据。

谢谢。

更新:

  1. 所需的行为是从 C# 接收的文件字节数组以及使用 C 代码写入文件时应该使文件在 Adob​​e 中成功打开。
  2. 问题中存在的代码应该足以让某人生成一个 win32 dll,它只是写出指向文件的 char 指针,但我添加了更多细节。
4

1 回答 1

2

您可能在fopen没有b模式标志的情况下调用。附加b到您的模式说明符:

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

这个网站(强调我的):

文本文件是包含文本行序列的文件。根据应用程序运行的环境,在文本模式下的输入/输出操作中可能会发生一些特殊字符转换,以使其适应系统特定的文本文件格式。尽管在某些环境中不会发生转换并且文本文件和二进制文件的处理方式相同,但使用适当的模式可以提高可移植性。

\n根据我的经验,Windows上的这种“转换”\r\n至少会发生变化。

于 2015-11-27T13:24:35.600 回答