unsigned char *が指すメモリ領域のサイズは?
質問
わかりました、これは以前に尋ねられたことを知っていますが、検索した後、適切な答えが見つかりませんでした。
バッファー(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);
}
}
解決
NULLで終了または何かで終了していない場合、サイズを知る唯一の方法は、最初に取得したときにそれを追跡することです。
最初にバッファをどのように取得していますか?それが何であれ、おそらくバッファの長さも取得する方法を提供します。
編集
コメント:
メモリのサイズがあります データがかかります。それで遊んでみた しかし、それは正しい情報ではありません どうやら。
その場合、生のサイズを各要素のサイズで割って要素の数を取得します:
unsigned numelem = size / sizeof(unsigned char)
sizeof(unsigned char)が標準で1に定義されているため、バッファ内の要素の数は、バッファが使用するスペースの量にすぎません。
「要素のサイズで分割する」あらゆるタイプの要素に対するより一般的なソリューションです。
他のヒント
残念ながら、この質問に対する一般的な答えは本当にありません。 C / C ++では、特定のポインターが指す要素の数を単純に知ることはできません。この知識を維持するためのポインターを維持するのは、コードの責任です。
この情報は、ポインターのサイズがわかっている最も近いポイントから通す必要があります。
if (pBytes = (unsigned char *) GlobalLock(hMem))
この場合、グローバルメモリブロックへのハンドルhMemがあります。このハンドルは、GlobalAlloc()またはGlobalReAlloc()の呼び出しによって取得されている必要があります。これらの呼び出しのいずれかを行う場合、メモリサイズを知っている必要があります。これは、探しているバイトの長さです。
Cスタイルの配列の場合、サイズをすでに知っているか、センチネルで終端された(NULLなどの)配列が必要です。ランタイムマシンは割り当てられたメモリ量にアクセスできますが、それにアクセスするための安全で移植可能な方法はありません。