【问题标题】:Convert PHP chr()/strval() function to C++将 PHP chr()/strval() 函数转换为 C++
【发布时间】:2019-03-06 13:20:11
【问题描述】:

我正在尝试将字符操作库从 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)));

在这个 sn-p 中,我们从字符串“5522446633”中提取 2 个字符,并从函数 strval() 中“获取它们的字符串值”(PHP manual)。

我知道如何从 C++ 中的一个字符中获取(整数)值,但是如何处理两个字符呢?

如何将这个 sn-p 翻译成 C++?

【问题讨论】:

  • 您的所有问题都可以通过打开您的 C++ 书籍到解释如何使用 std::string 的章节来回答。 std::string 也有一个非常相似的 substr() 函数,而 PHP 的 strval() 在这种情况下完全没有意义。最接近的类似物是std::string 的构造函数。 C++ 不是 PHP,它在基本方面与 PHP 不同。如果你试图不断地将它与 PHP 等同起来,你只会阻碍你自己对 C++ 的理解。帮自己一个忙,如果你认真想精通 C++,就完全忘记你对 PHP 的了解。
  • @SamVarshavchik :对不起,先生,但我的 C++ 书告诉我 static_cast、std::string 和 wathever 的行为方式,而不是我的解释/翻译在这种情况下是否正确。我没有问我是否必须忘记有关 PHP 的所有内容,我只是指出我不了解有关 strval("AB") 的返回值的文档,以及如何用 C++ 做同样的事情:是 ASCII 'A' 的值 + 'B' 的 ASCII 值,MSB 上的 'A' 的 ASCII 值和 LSB 上的 'B' 的 ASCII 值,ASCII 'A' 模什么?
  • 一个简单的谷歌搜索“php strval”会立即找到关于“strval()”在 PHP 中的作用的完整解释,而且它肯定会比坐着等待别人响应要快得多在 stackoverflow.com 上。 strval 只是将一些任意 PHP 变量转换为字符串,而且,正如我耐心解释的那样,这通常是 std::string 的许多构造函数所做的。在某些情况下,格式化的输出运算符可能是 C++ 的等价物。再一次:没有直接的翻译,C++ 中的数字绘制等效于 PHP 中的某些东西。它们根本不同。
  • chr("AB") 产生空输出,因为“AB”不是有效数字。您确定这是您要转换的 php 代码吗?
  • @AlanBirtles :是的,在 PHP 脚本的注释中,它说 convert char two by two。此代码取自 GS1-128 条码生成器。

标签: php c++ code-translation


【解决方案1】:

以下代码相当于你的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";
}

【讨论】:

    【解决方案2】:

    首先注意c++中的字符串类型与字符类型有很大的不同。

    字符类型表示为单个 8 位数字。

    std::string 是一个表示字符串的类(详见http://www.cplusplus.com/reference/string/string/)。

    所以关于 1 - 你的例子可能行不通。 std::string 不接受单个字符作为构造函数。 您可以使用以下内容从数字中创建长度为 1 的 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/)

    【讨论】:

      猜你喜欢
      • 2014-04-26
      • 2015-01-17
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多