Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP不能计数(二进制十六进制奇怪)?_Php_Perl_Binary_Hex - Fatal编程技术网

PHP不能计数(二进制十六进制奇怪)?

PHP不能计数(二进制十六进制奇怪)?,php,perl,binary,hex,Php,Perl,Binary,Hex,在Perl中,我的代码工作正常: print unpack('B*','10071C2'); 返回00110001100000011100000110110110011000101000011110010 使用GMP将代码移植到PHP: function gmp_convert($num, $base_a, $base_b) { return gmp_strval ( gmp_init($num, $base_a), $base_b ); } $test = "10071C2"

在Perl中,我的代码工作正常:

print unpack('B*','10071C2');
返回00110001100000011100000110110110011000101000011110010

使用GMP将代码移植到PHP:

function gmp_convert($num, $base_a, $base_b)
{
        return gmp_strval ( gmp_init($num, $base_a), $base_b );
}
$test = "10071C2";
$testb=gmp_convert($test, 16, 2);
生产1000000110110001110000010011011111101100011110000111

我认为它可能是字节顺序,但是如果在Perl中使用b*,它仍然会产生其他结果:

PHP---10000000110110001110000101001101111110110001101110000111
PERL--10001100000011000000110011101100100011001100001001001100

我只是不明白这一点,有人能帮忙吗?

您的Perl和PHP实现在做完全不同的事情

Perl代码将输入字符串中的每个字符转换为该字符的ASCII代码的二进制表示形式。例如,第一个字符1被转换为00110001,它等于十进制49,即字符1的ASCII码


PHP将以字符串形式表示的十六进制数编码为以字符串形式表示的等效二进制数。

您的Perl和PHP实现是完全独立的

Perl代码将输入字符串中的每个字符转换为该字符的ASCII代码的二进制表示形式。例如,第一个字符1被转换为00110001,它等于十进制49,即字符1的ASCII码


您的PHP将字符串形式的十六进制数编码为字符串形式的等效二进制表示。

不适用于您?我需要的是二进制字符串而不是bin数据:这就是它的功能。输入是字符串,输出是字符串。也不确定perl演示程序在做什么,但十六进制值0x10071C2是1000000011000111000010-通过启动计算程序或实际计算器,将其设置为十六进制模式,键入数字,然后要求它输入二进制数来确认这一点。您显示的PHP和Perl值都是大得多的数字。嗯,实际上,在文档中,十六进制字符串只是ASCII值,这就是它打印的原因。它返回一个二进制字符串,不可打印字符,而不是010011010二进制表示。程序按预期工作:b*和b*之间的区别perl实现并没有将十六进制数转换为二进制数。它正在将ASCII字符转换为每个字符字节的二进制表示形式。对您不起作用吗?我需要一个二进制字符串,而不是bin数据:它就是这样做的。输入是字符串,输出是字符串。也不确定perl演示程序在做什么,但十六进制值0x10071C2是1000000011000111000010-通过启动计算程序或实际计算器,将其设置为十六进制模式,键入数字,然后要求它输入二进制数来确认这一点。您显示的PHP和Perl值都是大得多的数字。嗯,实际上,在文档中,十六进制字符串只是ASCII值,这就是它打印的原因。它返回一个二进制字符串,不可打印字符,而不是010011010二进制表示。程序按预期工作:b*和b*之间的区别perl实现并没有将十六进制数转换为二进制数。它正在将ASCII字符转换为每个字符字节的二进制表示形式。哦,天哪。。我想我没想清楚:谢谢!哦,上帝。。我想我没想清楚:谢谢!