Quelle est la taille de la zone de mémoire désignée par un caractère non signé *?

StackOverflow https://stackoverflow.com/questions/1035222

  •  10-07-2019
  •  | 
  •  

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)

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);
    }
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top