【问题标题】:C++ HexToBin VS PHP Hex2Bin functions. Different outputC++ HexToBin VS PHP Hex2Bin 函数。不同的输出
【发布时间】:2018-04-14 20:36:06
【问题描述】:

我的 PHP 和 C++ 脚本中都有以下字符串:

152F302436152F302435152F302434152F302433152F302433

在 PHP 中,我使用内置的 hex2bin 函数:

<?php
    $HEXString = "152F302436152F302435152F302434152F302433152F302433";
    echo hex2bin($HEXString);
    //Outputs: /0$6/0$5/0$4/0$3/0$3 
    ?>

但是,在 C++ 中,我使用以下函数来完成相同的操作,并获得完整的其他结果:

const char* HexCharToBin(char c) {
    char cUpper = toupper(c);
    if (cUpper == '0') return "0000";
    else if (cUpper == '1') return "0001";
    else if (cUpper == '2') return "0010";
    else if (cUpper == '3') return "0011";
    else if (cUpper == '4') return "0100";
    else if (cUpper == '5') return "0101";
    else if (cUpper == '6') return "0110";
    else if (cUpper == '7') return "0111";
    else if (cUpper == '8') return "1000";
    else if (cUpper == '9') return "1001";
    else if (cUpper == 'A') return "1010";
    else if (cUpper == 'B') return "1011";
    else if (cUpper == 'C') return "1100";
    else if (cUpper == 'D') return "1101";
    else if (cUpper == 'E') return "1110";
    else if (cUpper == 'F') return "1111";
    else return "0000";
    }
string HexToBin(const string& hex) {
    string bin;
    for (unsigned i = 0; i != hex.length(); ++i) {
        bin += HexCharToBin(hex[i]);
        }
    return bin;
    }

C++ 代码:

cout << HexToBin("152F302436152F302435152F302434152F302433152F302433") << endl;
//Outputs: 00010101001011110011000000100100001101100001010100101111001100000010010000110101000101010010111100110000001001000011010000010101001011110011000000100100001100110001010100101111001100000010010000110011

我希望 C++ 实现与 PHP 返回相同的字符串。我在这里做错了什么?

【问题讨论】:

  • C++ 和 PHP 是两种完全不同的语言。将两者相提并论可能会适得其反。
  • 不熟悉PHP,但是/0$6/0$5/0$4/0$3/0$3如何对应"152F302436152F302435152F302434152F302433152F302433"
  • @StephanLechner,不知道,但这就是 hex2bin-PHP 函数的工作方式......
  • @Ron,对,但是在 C++ 中是否可以实现与在 PHP 中相同的结果?
  • 字符1(可能)用整数值49表示,250表示,以此类推。在 C++ 中,字符是字符。它们具有附加的基本整数值。

标签: php c++ hex bin


【解决方案1】:

如果您只想将十六进制数转换为二进制数,请使用base_convert()

仔细阅读hex2bin php documentation引用的内容:

注意 此函数不会将十六进制数转换为二进制数。这可以使用 base_convert() 函数来完成。

这个功能很简单

解码一个十六进制编码的二进制字符串。

因此,由于您的字符串不是十六进制编码的字符串,因此您会得到意外/不同的输出。

要复制 php 的 hex2bin 的行为,以下帖子可以帮助您:Missing punctuation from C++ hex2bin

希望对您有所帮助。

【讨论】:

  • 感谢您的评论。但是,我想用 C++ 实现 PHP 的行为。我怎样才能做到这一点?所以,基本上我需要 C++ 来生成与 PHP 相同的输出
  • @TVAvanHesteren:请查看更新后的链接。它可以帮助你。
  • 我已经尝试了链接,当我输入我的 HEXString 时,它没有给我与 PHP 相同的输出?
  • @TVAvanHesteren:好的,我无法为您提供帮助,因为我对 c++ 不太熟悉。但是,您可以使用 c 并通过在 php-src : link 中查看 hex2bin 的实现来复制行为。
【解决方案2】:
<?php
    $HEXString = "152F302436152F302435152F302434152F302433152F302433";
    echo base_convert(hex2bin($HEXString), 16, 2);
?>

我认为这种方法会返回您正在寻找的东西, 或者您可以使用 Array 简单地在 PHP 上的 C++ 上创建相同的函数,例如:

$base = array(
'1'=>"0001",
'2'=>"0010",
'3'=>"0011",
...
);
function HexToBin($string) {
$len = strlen($string);
$bin;
    for ($i = 0; $i < $len; $i++) {
        $bin += $base[$string[$i]];
        }
    return $bin;
    }
echo HexToBin("152F302436152F302435152F302434152F302433152F302433");
//Outputs: 00010101001011110011000000100100001101100001010100101111001100000010010000110101000101010010111100110000001001000011010000010101001011110011000000100100001100110001010100101111001100000010010000110011

【讨论】:

    【解决方案3】:

    我希望 C++ 实现与 PHP 返回相同的字符串。我在做什么 错了吗?

    当你知道 PHP 输出是错误的输出时该怎么办,这不是一个但在 PHP 中,这是hex2bin 函数的正常行为。

    您需要首先使用hexdec 将您的hex string 转换为十进制值,然后使用decbin 将您的十进制转换为二进制。

    $hex = decbin(
        hexdec("152F302436152F302435152F302434152F302433152F302433")
    );
    echo $bin;
    

    这会因为PHP integer limitation而导致问题

    在 decbin 手册页中,您可以导航至 Parameters section 以了解更多信息。


    你可以编写一个 PHP 函数来实现与 C++ 端相同的结果,或者使用 GMP 扩展来获取上例中的探测器输出。

    function _hex2bin($hex)
    {
        $hex = strtoupper($hex);
        $hexLen = strlen($hex);
        $bin = [];
        for ($i = 0; $i < $hexLen; $i++) {
            $char = $hex[$i];
            if ($char == '0') $bin[] = "0000";
            else if ($char == '1') $bin[] = "0001";
            else if ($char == '2') $bin[] = "0010";
            else if ($char == '3') $bin[] = "0011";
            else if ($char == '4') $bin[] = "0100";
            else if ($char == '5') $bin[] = "0101";
            else if ($char == '6') $bin[] = "0110";
            else if ($char == '7') $bin[] = "0111";
            else if ($char == '8') $bin[] = "1000";
            else if ($char == '9') $bin[] = "1001";
            else if ($char == 'A') $bin[] = "1010";
            else if ($char == 'B') $bin[] = "1011";
            else if ($char == 'C') $bin[] = "1100";
            else if ($char == 'D') $bin[] = "1101";
            else if ($char == 'E') $bin[] = "1110";
            else if ($char == 'F') $bin[] = "1111";
            else $bin[] = "0000";
        }
    
        return implode("", $bin);
    }
    
    echo _hex2bin("152F302436152F302435152F302434152F302433152F302433");
    

    现场样本:https://3v4l.org/IkRmG

    甚至更短:

    function _hex2bin($hex)
    {
        $hex = strtoupper($hex);
        $hexLen = strlen($hex);
        $bin = [];
        for ($i = 0; $i < $hexLen; $i++) {
            $char = $hex[$i];
            $bin[] = str_pad(base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT);
        }
    
        return implode("", $bin);
    }
    
    echo _hex2bin("152F302436152F302435152F302434152F302433152F302433");
    

    现场样本:https://3v4l.org/MoH8R

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多