Преобразуйте PHP chr () / strval () в C ++ - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь преобразовать библиотеку манипулирования символами из PHP в C ++.

1) Я использовал static_cast<char>() для замены всех отдельных chr() функций (применяется только к одному символу,то есть: PHP: $out = chr(50); => C++: std::string s = static_cast<char>(50)).

Это правильно?

2) Учитывая следующий код PHP:

$crypt = chr(strval(substr("5522446633",0,2)));

В этом фрагменте мы извлекаем 2 символа изстрока "5522446633" и "получить их строковые значения" ( руководство по PHP ) из функции strval().

Я знаю, как получить (целое) значение из одного символа в C ++, но как я могу сделать с двумя символами?

Как я могу перевести этот фрагмент на C ++?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Следующий код эквивалентен вашему php-коду:

#include <iostream>
#include <string>

std::string convert(const std::string& value)
{
  size_t pos;
  try
  {
      std::string sub = value.substr(0,2);
      int chr = std::stoi(sub, &pos);
      if (pos != sub.size())
      {
          return "";
      }
      return std::string(1, static_cast<char>(chr & 255));
  }
  catch ( std::exception& )
  {
      return "";
  }
}

int main()
{
  std::cout << convert("5522446633") << "\n";
}
0 голосов
/ 01 октября 2018

Первое замечание: строковый тип в c ++ сильно отличается от символьного типа.

Тип символа представлен в виде единого 8-битного числа.

std :: string - это класс для представлениястрока (подробнее см. http://www.cplusplus.com/reference/string/string/).

Итак, что касается 1 - ваш пример, вероятно, не сработает.std :: string не принимает ни одного символа в качестве конструктора.Вы можете использовать следующее для создания объекта std :: string длиной один из числа (используя конструктор заполнения, описанный в приведенной выше ссылке):

char c = 50;
std::string s(1,c);

Относительно 2, не уверен, что вы пытаетесьчтобы достичь, но так как строки C уже сохранены в виде массива байтовых чисел, вы можете, например, попробовать следующее:

std:string s = "ABCD"; 
// char* s = "ABCD"; would work the same way in this case
int byte1 = s[0];
int byte2 = s[1];

Если вам нужно разобрать шестнадцатеричную строку, вы можете использовать strtol (http://www.cplusplus.com/reference/cstdlib/strtol/)

...