3

わかりました、これが以前に尋ねられたことは知っていますが、検索した後、適切な答えが見つかりませんでした。

バッファー (unsigned char *) を base64 に変換する必要があります。使用している base64 関数はパラメーターとして次のように取ります。

void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)

は文字列int srclenの長さですsrc

私の質問は、バッファの長さをどのように取得するかです。いいえ、null で終了していません。いいえ、必要ありませんsizeof(BYTE)srclenそのバッファをbase64に変換できるように、何を渡すかを知る必要があります。

編集

ここに私がやっていることを示すいくつかのコードがあります:

unsigned char *pBytes;
unsigned char *B64Encoded;
int b64size = 0;

if (pBytes = (unsigned char *) GlobalLock(hMem))
{
    DWORD size = (DWORD)GlobalSize(hMem);
    b64size = size / sizeof(unsigned char);
    Base64Enc(pBytes, b64size, B64Encoded);

    // in this case save the buffer to a file just for testing
    if (fp = fopen("ububub.txt", "wb"))
    {   
        printf("data: %s\n", B64Encoded);
        fwrite(B64Encoded, strlen(B64Encoded), 1, fp);
        fclose(fp);
    }
}
4

4 に答える 4

4

NULL 終端または何かで終端されていない場合、サイズを知る唯一の方法は、最初に取得したときにそれを追跡することです。

そもそもどうやってバッファを取得していますか?それが何であれ、おそらくバッファの長さも取得する方法を提供します。

編集

あなたのコメント:

データが必要とするメモリのサイズがあります。私はそれで遊んでみましたが、どうやら正しい情報ではありません。

その場合、生のサイズを各要素のサイズで割り、要素の数を取得します。

unsigned numelem = size / sizeof(unsigned char)

sizeof(unsigned char)は標準で 1 と定義されていることを指摘してくれたTodd Gardnerに感謝します。したがって、バッファー内の要素の数は、バッファーが使用するスペースの量にすぎません。

「要素のサイズで割る」は、あらゆるタイプの要素に対するより一般的な解決策です。

于 2009-06-23T21:09:10.220 に答える
3

残念ながら、この質問に対する一般的な答えは実際にはありません。C/C++ では、特定のポインターが指している要素の数を単純に知ることはできません。この情報を保持するのは、ポインタを維持するコードの責任です。

ポインターのサイズがわかっている最も近いポイントからこの情報をスレッド化する必要があります。

于 2009-06-23T21:08:32.607 に答える
3
if (pBytes = (unsigned char *) GlobalLock(hMem))

この場合、グローバル メモリ ブロックへのハンドル hMem があります。このハンドルは、GlobalAlloc() または GlobalReAlloc() への呼び出しによって取得されている必要があります。これらの呼び出しのいずれかを行うときは、メモリ サイズを知っている必要があります。これは、探しているバイトの長さです。

于 2009-06-23T21:53:33.967 に答える
2

C スタイルの配列では、サイズを既に知っているか、センチネルで終了する (NULL のような) 配列が必要です。ランタイム機構は、割り当てられたメモリ量にアクセスできますが、安全で移植可能な方法でアクセスすることはできません。

于 2009-06-23T21:09:57.830 に答える