gpt4 book ai didi

c - 将从 C# 接收到的文件 byte[] 数组写入 C dll 中的文件

转载 作者:太空宇宙 更新时间:2023-11-03 23:23:13 25 4
gpt4 key购买 nike

我刚刚创建了一个简单的 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 指针指向一个文件,但我添加了更多细节。

最佳答案

您可能在调用 fopen 时没有使用 b 模式标志。将 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 上的这种“转换”至少会将 \n 更改为 \r\n

关于c - 将从 C# 接收到的文件 byte[] 数组写入 C dll 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33957933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com