【问题标题】:Why is my php code not outputting the same as my C++ using chr为什么我的 php 代码输出与使用 chr 的 C++ 不同
【发布时间】:2019-10-23 11:12:48
【问题描述】:

我正在将一个正常工作的 C++ 程序转换为 php。现在,尽管大多数程序都可以正常工作,但我在其中的一个方面遇到了问题。

在 C++ 中工作的代码在 php 中给出的结果不同。 这是为了稍后在我的代码中写入二进制文件。

这是 C++ 代码和结果。

C++
char test;
test = 16;
test+=(char)131;
std::cout << (int)test << endl;
Result = -109

这是 php 中的等效代码。

PHP
$test = chr(0);
$test = 16;
$test+= chr(131);
echo (int)$test;
Result = 16

我猜这可能与 unicode 编码给我错误的结果有关。结果应该是 -109,因为我的 C++ 程序可以正常工作,但我在 php 中没有得到相同的结果。

当我在 C++ 中 cout (int)(char)131 时,我得到 -125,但如果我在 php 中回显 chr(131),我得到 0;

有没有办法让我的 php 输出和我的 C++ 一样?

【问题讨论】:

  • 如果你在 C++ 中有这样的代码,那么你的程序已经够糟糕了,你应该尝试从头开始重写 PHP 解决方案,而不是忠实于 C++ 的翻译。
  • 可能的溢出是 c++ 中未定义的行为吗?
  • 据我所知,这是 C++ 中未定义的行为。有符号溢出的结果是未定义的。如果它按预期工作,那么你很幸运,但下一次运行时行为可能会改变。 stackoverflow.com/questions/16188263/…
  • 仅仅因为它似乎只适用于你的情况,一个特定的编译器构建了一组特定的优化和一个特定的目标,并不意味着它适用于所有编译器、所有优化和所有目标。 UB 在这种情况下很棘手。
  • PHP 转换例如12 + "12"12 + 12。您的声明$test+= chr(131); 等同于$test = 16 + chr(131)chr(131) 无法转换为数字,因此结果为 16

标签: php c++


【解决方案1】:

您可以通过以下方式实现:

<?php
    $test = 16;
    $test = ($test + 131) % 256;
    if ($test > 127) {
        $test -= 256;
    }
    echo $test;
?>

补充

$test+= chr(131);

不符合您的预期。 PHP 尝试将字符串/字符 chr(131) 转换为数字。它无法转换它,因为字符串不包含任何数字,因此该语句等效于

$test+= 0;

【讨论】:

    【解决方案2】:

    我认为干净的方法是首先将 c++ 表达式 (int)(char)131 正确转换为 PHP 整数,然后添加值。转换实现函数signByteToInt():

    <?php
    function signByteToInt($byteVal){
      $byteVal &= 0xff;
      if($byteVal & 0x80) $byteVal -= 0x100;
      return $byteVal;
    }
    

    使用示例

    $test = signByteToInt(16);  //16
    $add = signByteToInt(131);  //-125
    
    echo $test+$add;  //-109
    

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      相关资源
      最近更新 更多