「Test」という単語を含む単純な PDF ドキュメントを作成し、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コードでは、次のように、一時ファイルに直接受け取った文字ポインターを1文字ずつ記述しました。
while (length> 0)
{
fprintf(outFile, "%c", *fileData); //fileData is the actual byte array received from C# Code
fileData++;
length--;
}
しかし、ここで問題が発生します。バイト配列を 1 文字ずつファイルにダンプする C コードは、9,755 バイトのサイズのファイルを生成します。内部のコンテンツのほとんどは正しいように見えますが、いくつかの新しい行が導入されていることを除いて (私の知る限り、いくつかの追加データである可能性があります)、PDF ファイルが破損し、このダンプされたバージョンが Adobe で開かれません。 . 誰かが私が間違っているかもしれない場所についていくつかの指針を提供してもらえますか? %s in fprint
PDF のバイト配列の一部の組み合わせにより、C で null で終了する文字列が生成され、予想よりも少ないデータがダンプされるため、使用できません。
ありがとう。
アップデート:
- 望ましい動作は、ファイル バイト配列が C# から受信され、C コードを使用してファイルに書き込まれたときに、ファイルが Adobe で正常に開かれるようにすることです。
- 問題に存在するコードは、誰かが単にファイルへの char ポインタを書き出す win32 dll を生成するのに十分なはずですが、さらに詳細をいくつか追加しました。