Pregunta

Ok, sé que esto se ha preguntado antes, pero después de buscar no pude encontrar una respuesta adecuada.

Necesito convertir un buffer (unsigned char *) a base64, la función base64 que estoy usando toma como parámetros:

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

donde int srclen es la longitud de la cadena src .

Mi pregunta es, ¿cómo obtengo la longitud de mi búfer? No, no es nulo terminado. No, no quiero el sizeof (BYTE) . Solo necesito saber a qué pasar como srclen para poder convertir ese búfer en base64.

EDITAR :

Aquí hay un código que muestra lo que estoy haciendo:

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);
    }
}
¿Fue útil?

Solución

Si no es NULL terminado o algo terminado, la única forma de saber el tamaño es hacer un seguimiento de él cuando lo obtuvo por primera vez.

¿Cómo estás obteniendo el buffer en primer lugar? Sea lo que sea, probablemente le proporcione un método para obtener también la longitud del búfer.

EDITAR

Tu comentario:

  

Tengo el tamaño de la memoria que el   toma de datos. Traté de jugar con eso   pero no es la información correcta   aparentemente.

En ese caso, tome su tamaño sin procesar y divídalo por el tamaño de cada elemento para obtener el número de elementos:

unsigned numelem = size / sizeof(unsigned char)

Gracias a Todd Gardner por señalar que sizeof (unsigned char) es definido por el estándar como 1, por lo que la cantidad de elementos en su búfer es solo la cantidad de espacio que usa su búfer.

La " dividir por tamaño del elemento " es la solución más general para cualquier tipo de elemento.

Otros consejos

Desafortunadamente, realmente no hay una respuesta genérica a esta pregunta. En C / C ++ no es posible saber simplemente a cuántos elementos apunta un puntero en particular. Es responsabilidad del código que mantiene el puntero mantener este conocimiento.

Tendrá que pasar esta información desde el punto más cercano donde sepa el tamaño del puntero.

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

En este caso, tiene un controlador hMem para un bloque de memoria global. Este identificador debe haberse obtenido mediante una llamada a GlobalAlloc () o GlobalReAlloc (). Al realizar una de estas llamadas, debe haber conocido el tamaño de la memoria. Esta es la longitud de bytes que está buscando.

Con una matriz de estilo c, ya debe conocer el tamaño o tener una matriz terminada en centinela (como NULL). La maquinaria de tiempo de ejecución tiene acceso a la cantidad de memoria asignada, pero no hay una forma segura y portátil de acceder a ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top