Разница между кодом1 и кодом2

код 1

uint8_t  ucAESKey_BASE64[] = "oFqTg0a0VrjiVU76M1WRVw==";
uint8_t *pucAESKey_BASE64;
pucAESKey_BASE64 = ucAESKey_BASE64;

код 2

uint8_t *pucAESKey_BASE64 = "oFqTg0a0VrjiVU76M1WRVw==";

Я использую mbedtls_base64_decode() для декодирования строки base64, API mbedTLS.

int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
                   const unsigned char *src, size_t slen )

Моя программа такая:

mbedtls_base64_decode(ucAESKey, sizeof(ucAESKey), &olen, 
                      pucAESKey_BASE64, strlen(pucAESKey_BASE64));

Если параметр *src использует код 2 , вывод будет

00 00 00 83 46 b4 56 b8 e2 55 4e fa 33 55 91 57

если *src использует код 1, вывод

a0 5a 93 83 46 b4 56 b8 e2 55 4e fa 33 55 91 57

и это правильно. Почему?


person RGW    schedule 13.04.2017    source источник
comment
Почему вы используете strlen для буфера, отличного от const char *?   -  person PaulMcKenzie    schedule 13.04.2017
comment
Вероятно, возникли проблемы, потому что вы объявляете один как массив, а другой как нет: uint8_t ucAESKey_BASE64[] = oFqTg0a0VrjiVU76M1WRVw==; uint8_t *pucAESKey_BASE64 = oFqTg0a0VrjiVU76M1WRVw==; Должно быть: uint8_t ucAESKey_BASE64 = oFqTg0a0VrjiVU76M1WRVw==; uint8_t *pucAESKey_BASE64 = oFqTg0a0VrjiVU76M1WRVw==;   -  person Edward B.    schedule 13.04.2017
comment
Покажите объявления и как инициализируются ucAESKey и olen.   -  person Michael Burr    schedule 13.04.2017
comment
можешь попробовать вот это: char *pcaAESKey_BASE64 = "oFqTg0a0VrjiVU76M1WRVw==";   -  person Taha Paksu    schedule 13.04.2017
comment
Обычно это проблема использования sizeof с указателями, ожидая, что он вернет то же, что и strlen. Инициализируется ли ucAESKey одинаково в обоих случаях?   -  person Groo    schedule 13.04.2017
comment
Маловероятно, что именно то, что вы описываете, происходит на самом деле. Покажите минимально воспроизводимый пример.   -  person n. 1.8e9-where's-my-share m.    schedule 13.04.2017


Ответы (1)


Поскольку ввод mbedtls_base64_decode() представляет собой строку base64, можно использовать strlen, поскольку мы не ожидаем никаких нулевых символов во входных данных. Я попытался воспроизвести вашу проблему, но оба входа генерируют один и тот же результат, поэтому я предполагаю, что ваши другие входы разные, как @n.m. предполагает. Я пробовал следующее:

int main( int argc, char *argv[] )
{
    unsigned char ucAESKey[32] = { 0 };
    size_t olen = 32;
    size_t i;
#if 0
    uint8_t  ucAESKey_BASE64[] = "oFqTg0a0VrjiVU76M1WRVw==";
    uint8_t *pucAESKey_BASE64;
    pucAESKey_BASE64 = ucAESKey_BASE64;
#else
    uint8_t *pucAESKey_BASE64 = "oFqTg0a0VrjiVU76M1WRVw==";
#endif
    mbedtls_base64_decode(ucAESKey, sizeof(ucAESKey), &olen,
                   pucAESKey_BASE64, strlen(pucAESKey_BASE64));

    for (i = 0; i < olen; i++)
    {
        mbedtls_printf("0x%x ", ucAESKey[i]); 
    }
return 0;
}
person Ron Eldor    schedule 31.12.2017