Кодирование std :: string в C ++ - PullRequest
0 голосов
/ 21 марта 2012

Я написал простой Person класс со следующими членами:

std::string _fname;
std::string _lname;
int _age;

Я планирую написать класс AddressBook позже с vector<Person> _contacts в качестве переменной-члена. Пока я решил, что сериализовать AddressBook будет означать запись зашифрованной версии каждого контакта в отдельной строке в файле, который будет открыт в двоичном режиме. В основном это будет строка, которую я проанализирую позже, чтобы получить значения, где-то вдоль этих строк: "John~Doe~42"

Однако я хочу закодировать эту строку, потому что, если мой Person класс получит много новых переменных-членов, эта строка может стать довольно длинной. Я надеялся, что он может быть закодирован как шестнадцатеричное представление, но это кажется маловероятным, поэтому я должен спросить, есть ли другие способы кодировать std::string, чтобы сделать его нешифруемым для людей, если не компактным?

Ответы [ 4 ]

4 голосов
/ 21 марта 2012

Однако я хочу закодировать эту строку, есть ли другие способы закодировать std :: string, чтобы люди не могли ее расшифровать

.Какие люди?

Лично я классифицирую их как:

  • "Мой глупый брат"
  • "Моя любопытная, но умная мама"
  • "Aконкурирующая компания "
  • " Правительство ".

Шифрование для избиения людей:

  • Брат: (добавьте 'N' к каждому символу) (вычтите 'N' для декодирования)
  • Мать:(XOR ключ)
  • Компания: Не говоря уже о реальном пакете шифрования (например, SHA-512)
  • Правительство: Да, верно.
    Если они хотят что-то получить от меня, у меня естьнет шансов.
    Так что я нанимаю профессиональную компанию, чтобы справиться с этим.

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

В двоичном / текстовом режиме нет никакой разницы.Двоичный режим просто означает, что \ n не преобразуется в End of Line Sequence.

В основном это будет строка, которую я проанализирую позже, чтобы получить значения, где-то вдоль строк: "Джон ~ Доу ~ 42"

Конечно,но я бы использовал '' (пробел) в качестве разделителя (поскольку потоковая библиотека уже использует в качестве разделителя по умолчанию).Это сделает код намного проще для написания.Как отмечалось ранее, строки должны быть закодированы с их длиной (если только у вас нет строк фиксированной длины).

, потому что, если мой класс Person получает много новых переменных-членов, эта строка может быть довольно длинной.

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

Я надеялся, что его можно закодировать как шестнадцатеричное представление

Это неимеет смысл.
Все просто число.

если не компактно?

Конечно, вы можете сжать данные.
Посмотрите алгоритмы сжатия.

1 голос
/ 21 марта 2012

Как насчет использования sqlite ? Используя его, вам не нужно сериализовать данные и т. Д. И т. Д. Вы просто создаете файл в двоичном формате и получаете доступ к обычной базе данных.

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

Здесь Вы можете найти хорошее вступление.

0 голосов
/ 21 марта 2012

Вы будете в лучшем месте, используя XML в качестве формата файла.Таким образом, если вы решили добавить дополнительное «отчество» в свой класс Person в версии 2, содержимое адресной книги может быть обратно и обратно совместимо со старыми и более новыми версиями вашего кода.

Сериализация ваших данныхкак XML, а затем сжать для победы.Существует множество хороших библиотек сжатия, которые в основном бесплатны и содержат исходные тексты. zlib работает хорошо.

Также есть библиотека Boost Serialization , на которую можно посмотреть.

Много XML-библиотек.Бинг за это.

0 голосов
/ 21 марта 2012

Вы можете попробовать XOR или добавить значение ASCII для смещения символов. Как преобразовать 'a' в 'r', 'b' в 's'. Подобный метод не очень сильный, но люди не могут смотреть на него и читать его напрямую. Но для чего-либо серьезного, такого как номер социального страхования, номер кредитной карты, вы хотите использовать что-то более серьезное и быть более осторожным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...