Как найти длину строки в C без strlen () или искать терминатор NULL - PullRequest
0 голосов
/ 24 октября 2011

Мне нужно посчитать длину строки, закодированной с использованием сжатия Хаффмана.У него могут быть символы \ 0, поэтому strlen() или любая другая функция, которая ищет терминатор NULL, не будет работать.Как я могу определить длину такой строки?

Ответы [ 4 ]

4 голосов
/ 24 октября 2011

Это невозможно. Идите по полю и идите до конца . Там не будет ничего, кроме остальной части поля, чтобы отметить конец.

  • Вычислить длину до шифрования (обычно шифрование не должно ее менять)
  • Используйте символ, который может не отображаться в строке (если он есть) в качестве терминатора

EDIT

ОП упомянул, что он использует Хаффмана для сжатия.

В этом случае функция сжатия должна возвращать размер сжатой строки.

3 голосов
/ 24 октября 2011

Вы можете использовать структуру с int для длины и указателем на символ для хранения ваших строк. Используйте malloc для выделения памяти и memcpy для работы со строками.

2 голосов
/ 24 октября 2011

Важный вопрос: что вы используете для шифрования? Если эта библиотека шифрования не меняет длину строки, вы должны знать, насколько большой была строка раньше, потому что вы могли strlen() ее раньше.

Если библиотека меняет длину, вам нужно будет передать ей буфер и сообщить библиотеке ее размер. Затем библиотека должна вернуться, если вызов был успешным (т.е. буфер был достаточно большим) и насколько велика цель.

Примечание: если вы используете блочный шифр, вам разрешено вводить блоки только определенной длины (не короче и не длиннее), и в результате получается буфер фиксированного размера - в случае openssl есть макрос #define в котором указывается длина блока и длина результата.

совместное использование кода будет приветствоваться здесь.

1 голос
/ 24 октября 2011

В C строка - это массив символов, оканчивающихся двоичным 0. Если у вас 0, разбросанные по вашей строке, это больше не строка.

В процессе шифрования вам необходимо сохранить длину строки, которая теперь является не строкой, а двоичными данными. Вы также можете определить магическую последовательность символов, которая завершает зашифрованную строку, но затем вы должны убедиться, что магическая последовательность никогда не встраивается в зашифрованные данные.

...