1

ディスクから jpg ファイルを読み込んで、char バッファにコピーしようとしています。問題は、バイトに NULL 文字があり、char バッファーを読み取るときに問題が発生することです。これは現在のコードです:

char* readImg(char* filename)
{
    FILE * pFile;
    char jpgBuffer[20048];
    long lSize;
    errno_t result = fopen_s (&pFile,filename,"rb");
    if (result != 0) {
        printf("Error \n");
    }

    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    result = fread (jpgBuffer,1,lSize,pFile);
    fclose (pFile);

    jpgBuffer[lSize] = '\0';
    return jpgBuffer;
}

関数の呼び出しは次のとおりです。

char* img = readImg("img.jpg");

次に、base64 にエンコードする必要がありますが、strlen() を使用して画像バッファーのサイズを知りたい場合は、5 文字が「0」であるため、サイズが 4 になります。

イメージ バッファに NULL 文字が入らないようにするにはどうすればよいですか?

4

5 に答える 5

2

関数プロトタイプは変更できます。

long readImage(const char* filename, char* buf, long bufSize)
{
    FILE * pFile;
    long lSize;
    errno_t result = fopen_s (&pFile,filename,"rb");
    if (result != 0) {
        printf("Error \n");
    }

    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    if(bufSize < lSize)
    {
        printf("buf too small, needs %lu\n", lSize);
        fclose(pFile);
        return -1;
    }

    result = fread (buf,1,lSize,pFile);
    fclose (pFile);

    return lSize;
}

次に、img データとその実際のサイズを取得します。malloc を使用してもかまわない場合は、関数内のバッファーにメモリを割り当てることができます。

long readImage(const char* filename, char** pbuf)
{
    FILE * pFile;
    long lSize;
    errno_t result = fopen_s (&pFile,filename,"rb");
    if (result != 0) {
        printf("Error \n");
    }

    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    *pbuf = (char*)malloc(lSize * sizeof(char));
    result = fread (*buf,1,lSize,pFile);
    fclose (pFile);

    return lSize;
}

次のようにこの関数を呼び出します。空きバッファを覚えておく必要があります。

char* buf = NULL;
long len = 0;

len = readImage(filename, &buf);

...

free(buf);
于 2013-06-14T09:04:16.723 に答える
2

lSizeで決定しreadImg(...)た をファイル サイズとして使用します。strlennull で終了する文字列用です。strlen画像サイズをバイト単位で決定するために使用しないでください。

また、バイトサイズとして使用しjpgBufferてヒープ変数として割り当てる必要があることに注意してください。そうすれば、ヒープメモリへのポインターを返すことができます。関数が戻った後、現在のスタック変数は無効になるため、それへのポインターになります。このようにして、ハードコードされた値よりも多くのバイトが必要な状況について心配する必要もありません (現在はチェックしていません!)。new[]lSizejpgBuffer

また、入力パラメーター ポインター/ref 変数を介して を返すことも必要になるlSizeため、後で反復する境界ができます。

于 2013-06-14T08:57:26.773 に答える
0

jpgBuffer「文字列」ではなく「バイナリ」バッファです。最後にヌル文字を置くのは無意味です。変数を使用しresultてバッファを読み取る必要があります。

于 2013-06-14T08:58:03.797 に答える