Domanda

Ok, so che questo è stato chiesto prima ma dopo la ricerca non sono riuscito a trovare una risposta corretta.

Devo convertire un buffer (unsigned char *) in base64, la funzione base64 che sto usando prende come parametri:

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

dove int srclen è la lunghezza della stringa src .

La mia domanda è: come posso ottenere la lunghezza del mio buffer. No, non è nullo. No, non voglio la sizeof (BYTE) . Devo solo sapere a cosa passare come srclen in modo da poter convertire quel buffer in base64.

Modifica :

Ecco un po 'di codice che mostra cosa sto facendo:

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);
    }
}
È stato utile?

Soluzione

Se non è NULL terminato o qualcosa di terminato, l'unico modo per conoscere la dimensione è di tenerne traccia quando lo hai ricevuto per la prima volta.

Come stai ottenendo il buffer in primo luogo? Qualunque cosa sia probabilmente ti dà un metodo per ottenere anche la lunghezza del buffer.

Modifica

Il tuo commento:

  

Ho la dimensione della memoria che il   i dati prendono. Ho provato a giocarci   ma non è l'informazione corretta   a quanto pare.

In tal caso, prendi la tua dimensione grezza e dividila per la dimensione di ciascun elemento per ottenere il numero di elementi:

unsigned numelem = size / sizeof(unsigned char)

Grazie a Todd Gardner per aver sottolineato che dimensione del (carattere non firmato) è definito dallo standard come 1, quindi il numero di elementi nel buffer è solo la quantità di spazio utilizzata dal buffer.

La "divisione per dimensione dell'elemento" è la soluzione più generale per qualsiasi tipo di elemento.

Altri suggerimenti

Purtroppo non esiste davvero una risposta generica a questa domanda. In C / C ++ non è possibile semplicemente sapere a quanti elementi punta un determinato puntatore. È responsabilità del codice che mantiene il puntatore mantenere questa conoscenza.

Dovrai passare attraverso queste informazioni dal punto più vicino in cui conosci le dimensioni del puntatore.

if (pBytes = (unsigned char *) GlobalLock(hMem))

In questo caso hai un handle hMem su un blocco di memoria globale. Questo handle deve essere stato ottenuto da una chiamata a GlobalAlloc () o GlobalReAlloc (). Quando si effettua una di queste chiamate, è necessario conoscere la dimensione della memoria. Questa è la lunghezza dei byte che stai cercando.

Con un array in stile c, devi già conoscere la dimensione o avere un array con terminazione sentinella (come NULL). Il macchinario di runtime ha accesso alla quantità di memoria allocata, ma non esiste un modo sicuro e portatile per accedervi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top