Quelle est la taille de la zone de mémoire désignée par un caractère non signé *?
Question
D'accord, je sais que cela a déjà été demandé, mais après une recherche, je n'ai pas trouvé de réponse satisfaisante.
Je dois convertir un tampon (unsigned char *) en base64, la fonction base64 que j'utilise prend comme paramètres:
void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)
où int srclen
est la longueur de la chaîne src
.
Ma question est la suivante: comment obtenir la longueur de mon tampon? Non, ce n'est pas nul terminé. Non, je ne veux pas de sizeof (BYTE)
. J'ai juste besoin de savoir quoi passer en tant que srclen
pour pouvoir convertir ce tampon en base64.
MODIFIER :
Voici un code montrant ce que je fais:
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);
}
}
La solution
Si elle n'est pas terminée par NULL ou par quelque chose, le seul moyen de connaître la taille est de garder une trace de la première fois.
Comment obtenez-vous le tampon en premier lieu? Quoi que ce soit, cela vous donne probablement une méthode pour obtenir également la longueur du tampon.
EDIT
Votre commentaire:
J'ai la taille de la mémoire que le les données prennent. J'ai essayé de jouer avec ça mais ce n'est pas l'information correcte apparemment.
Dans ce cas, prenez votre taille brute et divisez-la par la taille de chaque élément pour obtenir le nombre d'éléments:
unsigned numelem = size / sizeof(unsigned char)
Merci à Todd Gardner d'avoir signalé que sizeof (caractère non signé) est défini par la norme comme étant 1, le nombre d'éléments dans votre tampon correspond donc à la quantité d'espace utilisée par votre tampon.
Le " diviser par la taille de l'élément " est la solution la plus générale à tout type d’élément.
Autres conseils
Malheureusement, il n’ya pas vraiment de réponse générique à cette question. En C / C ++, il n'est pas possible de savoir simplement combien d'éléments sont pointés par un pointeur particulier. C’est la responsabilité du code qui maintient le pointeur de conserver cette connaissance.
Vous devrez passer ces informations depuis le point le plus proche où vous connaissez la taille du pointeur.
if (pBytes = (unsigned char *) GlobalLock(hMem))
Dans ce cas, vous avez un handle hMem vers un bloc de mémoire global. Ce descripteur doit avoir été obtenu par un appel à GlobalAlloc () ou GlobalReAlloc (). Lorsque vous effectuez l'un de ces appels, vous devez connaître la taille de la mémoire. C’est la longueur en octets que vous recherchez.
Avec un tableau de style c, vous devez déjà connaître la taille ou disposer d’un tableau terminé par Sentinel (comme NULL). La machine d'exécution a accès à la quantité de mémoire allouée, mais il n'y a pas de moyen sûr et portable d'y accéder.