Получить длину массива беззнаковых символов в C - PullRequest
0 голосов
/ 09 ноября 2019

Как я могу получить длину массива, который является массивом unsigned char*?

Это мой массив:

unsigned char ot[] = { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0 };

Я пытался использовать strlen() так: int length = strlen((char*) ot);

Возвращает мне длину от 11 до первого 0x0, но что мой массив меняет на это? (проверьте последний элемент)

unsigned char ot[] = { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0, 0x0, 0x0, 0x0, 0xa1 };

Тогда я получаю еще 11 элементов, как я могу получить "реальную" длину всего массива? Например, если после некоторого элемента 0x0 будут данные.

Например, для:

unsigned char* file_buffer = new unsigned char[BUFFER_SIZE];
fread(file_buffer,sizeof(unsigned char),BUFFER_SIZE,input_file)

Что может быть лучшим решением? Поскольку возвращаемое значение fread() может варьироваться, если я читаю последний кусок файла, и что если в файле будет 0x0 перед некоторыми данными?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019
unsigned char ot[] = {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0};

int _length = strlen((char *) ot);
printf("%d\n", _length); // 11

int length = sizeof(ot) / sizeof(unsigned char);
printf("%d\n", length); // 16

// reason behind strlen behaves like this

if (0x0 == '\0') {
    printf("Yes\n");
}

strlen() возвращает длину строки, когда находит null terminator, равное '\0'. Если вы запустите код, он напечатает Yes в конце, значит 0x0 фактически эквивалентно '\0' нулевому терминатору.

Используйте sizeof() для получения реальной длины.

1 голос
/ 09 ноября 2019

Как я могу получить длину массива, который является массивом unsigned char*?

В соответствии с примерами, которые вы привели, вы пытаетесь получить длину array [], а неarray *. Это может быть достигнуто с помощью ключевого слова sizeof (sizeof(ot)).

Однако, когда речь идет о указателях (например, unsigned char *), вам необходимо заранее знать размер, используя sizeofсверх него будет возвращен выделенный размер самого указателя, а не фактический размер содержимого этого указателя.

...