Различение встроенного NUL и NUL-терминатора - PullRequest
0 голосов
/ 10 июня 2018

У меня есть const char*, указывающий на данные в шестнадцатеричном формате, мне нужно найти длину данных, для которых я проверяю терминатор NUL, но когда появляется \x00, он обнаруживает его как NULтерминатор возвращает неправильную длину.
Как мне обойти это?

const char* orig = "\x09\x00\x04\x00\x02\x00\x10\x00\x42\x00\x02\x00\x01\x80\x0f\x00"
uint64_t get_char_ptr_len(const char *c)
{
    uint64_t len = 0;
    if (*c)
    {
        while (c[len] != '\0') {
            len++;
        }
    }
    return len;
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

\x обозначает шестнадцатеричное представление.

Посмотрите на таблицу ASCII , чтобы увидеть, что представляет \ x00.

\x00 = NULL // In Hexadecimal notation.

\x00 простодругой способ написать \0.

Попробуйте

const char orig[] = "\x09\x00\x04\x00\x02\x00\x10\x00\x42\x00\x02\x00\x01\x80\x0f\x00";

и

len=sizeof(orig)/sizeof(char);
0 голосов
/ 10 июня 2018

\x00 - это терминатор NUL;Фактически, \x00 - это просто еще один способ записи \0.

Если у вас есть байтовые данные, содержащие встроенные NUL, вы не можете использовать NUL в качестве ограничителя, точка;вы должны хранить указатель на данные и размер данных, точно так же, как функции, работающие с «необработанными байтами» (например, memcpy или fwrite).

Что касается литералов, убедитесь, чтоВы инициализируете массив (а не просто берете указатель на него), чтобы иметь возможность получить его размер, используя sizeof:

const char orig[] = "\x09\x00\x04\x00\x02\x00\x10\x00\x42\x00\x02\x00\x01\x80\x0f\x00";

Теперь вы можете использовать sizeof(orig), чтобы получитьего размер (который будет на один больше, чем число явно написанных символов, поскольку в конце есть неявный терминатор NUL);осторожно, поскольку массивы затухают, чтобы указывать практически на все доступные случаи, особенно при передаче функциям.

...