#c #binary-data
#c #двоичные данные
Вопрос:
Мне нужно посчитать длину строки, закодированной с использованием сжатия Хаффмана. Он может содержать символы ‘ 0’, поэтому strlen()
любая другая функция, которая ищет нулевой терминатор, не будет работать. Как я могу определить длину такой строки?
Комментарии:
1. Не могли бы вы показать нам свою логику, чтобы мы нашли, где ошибка
2. ошибка в дизайне. Либо длина должна быть сохранена на этапе шифрования и отслежена, либо необходимо выбрать специальную последовательность символов для определения конца.
3.
NULL
является указателем. ASCII nul (''
) — это символ. Вы решаете проблему, если алгоритм шифрования сообщает вам, сколько байт зашифрованных данных.
Ответ №1:
Это невозможно. Перейдите на поле и пройдите до конца. Для обозначения конца не будет ничего другого, кроме остальной части поля.
- Вычислите длину перед шифрованием (шифрование обычно не должно ее изменять)
- Используйте символ, который может не отображаться в строке (если он есть) в качестве терминатора
Редактировать
В OP упоминалось, что он использует Хаффмана для сжатия.
В этом случае функция сжатия должна возвращать размер сжатой строки.
Комментарии:
1. шифрование может изменить длину.
2. @Alex Спасибо за комментарий. Я не очень разбираюсь в шифровании, можете ли вы указать основные алгоритмы, которые изменяют длину?
3. его работа с назначением, мой старший сказал мне, что это не очень хорошее программирование, если вы подсчитываете длину строки, используя логику нулевых символов и strlen (
4. @Sam_k Это делает тебя его вассалом, верно ? Поэтому он обязан предоставить вам consilium et auxilium . Или наоборот?
5. @Sam_k Прежде всего, Хаффман используется для сжатия, А НЕ для шифрования. Во-вторых, сама функция сжатия должна возвращать длину выходных данных.
Ответ №2:
Вы могли бы использовать структуру с int для длины и указателем char для хранения ваших строк. Используйте malloc для выделения памяти и memcpy для манипулирования строками.
Комментарии:
1. Используйте
size_t
для длины вместоint
.
Ответ №3:
Важный вопрос заключается в том, что вы используете для шифрования? Если эта библиотека шифрования не изменяет длину строки, вы должны знать, насколько большой была строка раньше, потому что вы могли strlen()
это раньше.
Если библиотека изменяет длину, вам нужно будет передать ей буфер и сообщить библиотеке его размер. Затем библиотека должна вернуть, если вызов был успешным (т. Е. Буфер был достаточно большим) и насколько велика цель.
Примечание: если вы используете блочный шифр, вам разрешено вводить только блоки определенной длины (не короче или длиннее), а результат имеет буфер фиксированного размера — в случае openssl есть макрос #define
, который указывает длину блока и длину результата.
совместное использование кода было бы оценено здесь.
Ответ №4:
В C строка представляет собой массив символов, заканчивающийся двоичным 0. Если у вас есть 0, разбросанные по вашей строке, это больше не строка.
В процессе шифрования вам необходимо сохранить длину строки, которая теперь является не строкой, а двоичными данными. Вы также можете определить магическую последовательность символов, которая завершает зашифрованную строку, но тогда вы должны убедиться, что магическая последовательность никогда не внедряется в зашифрованные данные.
Комментарии:
1. но как узнать длину строки в первый раз без этой функции и этой логики..
2. его работа с назначением, мой старший сказал мне, что это не очень хорошее программирование, если вы подсчитываете длину строки, используя логику нулевых символов и strlen ()
3. Когда вы шифруете строку, вы должны получить длину зашифрованных данных. Прочитайте документацию по используемому вами методу шифрования..
4. Но как найти длину зашифрованных данных без логики нулевых символов.. Спасибо
5. Когда вы шифруете / сжимаете строку, сохраните длину сжатых данных в переменной
data_length
. Тогда вы сможете найти длину зашифрованных данных вdata_length
.