将从 C# 接收到的文件 byte[] 数组写入 C dll 中的文件
Write File byte[] array received from C# to a file in C dll
我刚刚创建了一个简单的 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,它只是写
输出指向文件的字符指针,但我添加了更多细节。
您可能在没有 b
模式标志的情况下调用 fopen
。将 b
附加到您的模式说明符:
FILE *outFile = fopen("file.txt", "wb")
来自 this site(强调我的):
Text files are files containing sequences of lines of text. Depending on the environment where the application runs, some special character conversion may occur in input/output operations in text mode to adapt them to a system-specific text file format. Although on some environments no conversions occur and both text files and binary files are treated the same way, using the appropriate mode improves portability.
根据我的经验,Windows 上的 "conversion" 至少将 \n
更改为 \r\n
。
我刚刚创建了一个简单的 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,它只是写 输出指向文件的字符指针,但我添加了更多细节。
您可能在没有 b
模式标志的情况下调用 fopen
。将 b
附加到您的模式说明符:
FILE *outFile = fopen("file.txt", "wb")
来自 this site(强调我的):
Text files are files containing sequences of lines of text. Depending on the environment where the application runs, some special character conversion may occur in input/output operations in text mode to adapt them to a system-specific text file format. Although on some environments no conversions occur and both text files and binary files are treated the same way, using the appropriate mode improves portability.
根据我的经验,Windows 上的 "conversion" 至少将 \n
更改为 \r\n
。