Pergunta

Ok, eu sei que isso foi solicitado antes, mas depois de pesquisar eu não poderia encontrar uma resposta adequada.

Eu preciso converter um buffer (unsigned char *) para base64, os base64 funcionar Eu estou usando toma como paramters:

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

onde int srclen é o comprimento da corda src.

A minha pergunta é, como faço para obter o comprimento do meu buffer. Não, não é um terminador nulo. Não, eu não quero o sizeof(BYTE). Eu só preciso saber o que passar como srclen para que eu possa converter esse buffer para base64.

Editar :

Aqui está um código mostrando o que eu estou fazendo:

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

Solução

Se não for NULL encerrado ou rescindido e poucos anos, a única maneira de saber o tamanho é manter o controle do que quando primeiro você tem.

Como você está recebendo o tampão em primeiro lugar? Seja lá o que é, provavelmente, lhe dá um método de também obter o comprimento do buffer.

Editar

O seu comentário:

Eu tenho o tamanho da memória que o dados leva. Eu tentei jogar com isso mas não é a informação correta aparentemente.

Nesse caso, tomar o seu tamanho cru e dividi-lo pelo tamanho de cada elemento para obter o número de elementos:

unsigned numelem = size / sizeof(unsigned char)

Graças à Todd Gardner por apontar que sizeof (char não assinado) é definido pelo padrão a ser 1, então o número de elementos em seu buffer é apenas a quantidade de espaço a seus usos tampão.

O "divide por tamanho de elemento" representa a solução mais geral para qualquer tipo de elemento.

Outras dicas

Infelizmente não há realmente uma resposta genérica a esta pergunta. Em C / C ++ não é possível simplesmente saber quantos elementos um determinado ponteiro aponta. É da responsabilidade do código que mantém o ponteiro para manter este conhecimento.

Você vai ter que enfiar esta informação através do ponto mais próximo onde você sabe o tamanho do ponteiro.

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

Neste caso, você tem um hMem identificador para um bloco de memória global. Esse identificador deve ter sido obtido por uma chamada para GlobalAlloc () ou GlobalReAlloc (). Ao fazer uma dessas chamadas que você deve ter conhecido o tamanho da memória. Este é o comprimento de bytes que você está procurando.

Com uma matriz C-estilo, você tem que já sabe o tamanho, ou ter uma sentinela terminado (como NULL) array. A maquinaria tempo de execução tem acesso à quantidade de memória alocada, mas não há uma maneira segura, portátil para acessá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top