Я использую libconfig для создания файла конфигурации, и одним из полей является содержимое зашифрованного файла. Проблема возникает из-за того, что в файле есть некоторые экранирующие символы, что вызывает частичное хранение содержимого. Каков наилучший способ хранения этих данных, чтобы избежать случайного побега символа? Преобразовать в юникод?
Любое предложение?
Вы можете использовать либо Кодировка URL, где каждый не-ASCII символ кодируется как %
символ, за которым следуют две шестнадцатеричные цифры, или вы используете регистр кодировка base64, где каждый набор из 3 байтов кодируется в 4 символа ASCII (3×8 бит -> 4×6 бит).
Например, если у вас есть следующие байты:
00 01 41 31 80 FE
Вы можете URL кодировать его следующим образом:
%00%01A1%80%FE
Или вы можете base64 кодировать его следующим образом: 0-25 = A-Z, 26-51 = a-z, 52-62 = 0-9, 62 =., 63 = /:
(00000000 00000001 01000001) (00110001 10000000 11111110) -->
(000000 000000 000101 000001) (001100 011000 000011 111110)
AAJBNYD.
Стандарт для кодирования двоичных данных в тексте раньше был uuencode и теперь base64. Оба используют одну и ту же парадигму: байт использует 8 бит, поэтому 3 байта используют 24-битные или 4-битные 6-битные символы.
uuencode только что использовал 6 бит со смещением 32 (код ascii для пробела), поэтому символы находятся в диапазоне 32-96 => все в диапазоне для печати ascii, но включают пробел и, возможно, другие символы, которые могут иметь специальные значения
base64 выбрал эти 64 символа для представления значений от 0 до 63 (нет =:;,'"\*(){}[]
это может иметь особое значение …)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
и знак равенства (=
) является заполнителем для пустых позиций и конца кодированной строки, чтобы гарантировать, что длина кодированной строки кратна 4.
К сожалению, ни стандартная библиотека C, ни C ++ не предлагают функций для uuencode, а не для преобразования base 64, но вы можете найти хорошие реализации вокруг, со многими указателями в этом другом ответе SO: Как base64 кодировать (декодировать) в C?