2014-11-27 2 views
0

Я пытаюсь разобрать полезную нагрузку в qt. Полезная нагрузка - это const u_char *, и у меня также есть ее длина. Полезная нагрузка может содержать нулевые символы.Окончание строки Qt

Я хотел бы выполнять различные операции с полезной нагрузкой, такие как поиск, если она содержит заданную строку, с использованием регулярного выражения на ней и т. Д., Поэтому использование QString было проще в управлении.

Так что я попытался использовать QString s ((const char *)); но этот конструктор не допускает нулевые символы внутри строки.

Поэтому мои вопросы:

  • Можно ли создать QString, содержащий нулевой символ?

  • Должен ли я использовать другой объект вместо QString, и если да, то один (тот, который будет по-прежнему позволяют искать в нем и сопоставить его с регулярным выражением?

Благодарности

+2

Вы заботитесь, чтобы посмотреть документацию класса QString? –

ответ

1

Если вы хотите использовать QRegExp (или QRegularExpression в Qt5), вам необходимо использовать QString. Чтобы построить QString из необработанных байтов, вам нужно указать кодировку символов для этого. Если ваша полезная нагрузка содержит UTF-8 текст, используйте QString::fromUtf8, который также принимает параметр размера. Затем данные могут также содержать нулевой символ, который будет частью строки, а не прекратить его действие:

QString str = QString::fromUtf8(data, length); 

Если вы хотите использовать регулярные выражения на двоичных данных, не используйте QRegExp. Вместо этого используйте boost::regex или std::regex, они хорошо обрабатывают двоичные данные. Они могут работать на std::string (но являются универсальными), который может быть построен также с конструктором данных и-длины, аналогичной приведенной выше коде:

string str { data, length }; 
+0

Вы уверены? Если я выполняю QString s = QString :: fromUtf8 ((const char *) полезная нагрузка, size_payload); Я все еще иногда получаю size_payload! = S.size() – jbaw1

+0

@ jbaw1 Это потому, что символы UTF-8 не всегда являются одиночными байтами. Как я сказал: делайте это только в том случае, если полезная нагрузка - это UTF-8. В противном случае используйте 'std :: regex' с' std :: string'. – leemes