Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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_Binary - Fatal编程技术网

Php 检查二进制字符串,此处出现错误

Php 检查二进制字符串,此处出现错误,php,binary,Php,Binary,我用这个函数来检查二进制文件是否正确,我知道它看起来很草率。。我不知道如何把函数写得那么好。。但它似乎不起作用 如果binary=10001000,则表示格式不正确,即使不是。。我的功能出了什么问题 function checkbinary($bin) { $binary = $bin; if(!strlen($binary) % 8 == 0){ return 1; } if (strlen($binary) > 100) {

我用这个函数来检查二进制文件是否正确,我知道它看起来很草率。。我不知道如何把函数写得那么好。。但它似乎不起作用

如果binary=10001000,则表示格式不正确,即使不是。。我的功能出了什么问题

function checkbinary($bin) {
    $binary = $bin;
    if(!strlen($binary) % 8 == 0){
        return 1;
    }
    if (strlen($binary) > 100) { 
        return 1;
    } 
    if (!preg_match('#^[01]+$#', $binary)){ //Tried without !
        return 1;
    } 
    if (!is_numeric($binary)) {
        return 1;   
    }
}

if (checkbinary("10001000") != 1) {
  echo "Correct";
} else {
  echo "Binary incorrect";
}
为什么这个函数总是说10001000不正确

如果(!strlen($binary)%8==0){
应该

if( strlen($binary) % 8 !== 0 ){
编辑并顺便说一句:由于您已经在使用preg_match(),因此可以将函数简化/缩短为

function checkbinary($binary) {
  return 1===preg_match('#^(?:[01]{8}){0,12}$#', $binary);
}
这允许使用0-12组8 0/1字符,其中包括当前函数中的所有测试:

  • strlen()%8被内部组中的{8}覆盖
  • strlen()>100被{0,12}覆盖,因为任何超过8*12=96个字符的字符串都会触发第一个
    if
    或>100测试
  • 0/1检验是明显的
  • 数字是多余的吗
edit2:name
checkbinary
可能不是该函数的完美选择。如果(!strlen($binary)%8==0){应该是,我不一定期望它检查8bit/字节对齐和strlen()

if( strlen($binary) % 8 !== 0 ){
编辑并顺便说一句:由于您已经在使用preg_match(),因此可以将函数简化/缩短为

function checkbinary($binary) {
  return 1===preg_match('#^(?:[01]{8}){0,12}$#', $binary);
}
这允许使用0-12组8 0/1字符,其中包括当前函数中的所有测试:

  • strlen()%8被内部组中的{8}覆盖
  • strlen()>100被{0,12}覆盖,因为任何超过8*12=96个字符的字符串都会触发第一个
    if
    或>100测试
  • 0/1检验是明显的
  • 数字是多余的吗
edit2:name
checkbinary
可能不是函数的完美选择。我不一定希望它检查8bit/字节对齐和strlen() 一些测试:和。


一些测试:和。

我不完全确定您试图实现的目标,但您可以通过以下方式实现

if($binaryString == base_convert($binaryString, 2, 2))...

本质上,这是比较从二进制到二进制的转换结果-因此,如果结果输出相同,则输入必须是有效的二进制字符串。

我不完全确定您试图实现什么,但您可能可以通过以下方法实现

if($binaryString == base_convert($binaryString, 2, 2))...

本质上,这是比较从二进制到二进制的转换结果-因此,如果结果输出相同,则输入必须是有效的二进制字符串。

preg_match()
要么返回
0
要么返回
1
,因此
0!=
是不必要的。@Alix:我希望它返回true/false,因为我不喜欢布尔类型的类型杂耍,所以我添加了一个显式测试。(这是我喜欢C的一点)我明白了,
返回(bool)preg_匹配(…)
不过会更明确一些。万分感谢,当我只看到一行时,我脸上露出了笑容,你知道我真的应该学一些正则表达式。我可以用你的解释从中学习,你很完美!@Alix:也许是这样,选择的问题。我把它改为1==preg_match()由于它在出现错误时也可能返回FALSE,并且1是表示“匹配”的唯一返回值,因此其他任何内容都是“失败的”。
preg_match()
要么返回
0
要么返回
1
,因此
0!=
是不必要的。@Alix:我希望它返回true/false,因为我不喜欢布尔类型的类型杂耍,所以我添加了一个显式测试。(这是我喜欢C的一点)我明白了,
返回(bool)preg_匹配(…)
不过会更明确一些。万分感谢,当我只看到一行时,我脸上露出了笑容,你知道我真的应该学一些正则表达式。我可以用你的解释从中学习,你很完美!@Alix:也许是这样,选择的问题。我把它改为1==preg_match()由于它在出现错误时也可能返回FALSE,并且1是表示“匹配”的唯一返回值,因此任何其他值都是“失败”。与其说是现在的答案,不如说是对未来的建议,但如果您要检查多个类似的条件,您可能希望为每个检查返回描述性消息,例如“$binary不是数字”对于is_数字测试,然后返回类似“Correct”的内容如果没有执行其他任何返回,则返回函数的结尾。这有助于您确定哪个检查的行为不符合您的要求。另一方面,我认为您对只包含1和0的字符串的正则表达式要求使is_数字检查变得不必要。@Lazy Bob:我认为他不太理解
返回的概念,
strlen($binary)>100
检查让我非常怀疑他试图做一件完全不同的事情。返回值“1”意味着“原始”实现中的
错误
(参见测试用例)。我们很难或几乎不可能确定这些测试是否有意义(考虑到我们拥有的少量信息),我现在唯一的抱怨是函数比名称所暗示的更多(……也许是返回值的奇怪选择)= @ MeMeMeMeMe:你想考虑012345、689012345、67 899…{ 104字符}吗?例如,作为一个有效的二进制数?与其说是现在的答案,不如说是对未来的建议,但如果您要检查多个这样的条件,您可能希望为每个检查返回描述性消息,比如is_数字测试的“$binary is not numeric”,然后返回“Correct”之类的消息如果没有执行其他任何返回,则返回函数的结尾。这有助于您确定哪个检查的行为不符合您的要求。另一方面,我认为您对只包含1和0的字符串的正则表达式要求使is_数字检查变得不必要。@Lazy Bob:我认为他不太理解
返回的概念,strlen($binary)>100的支票让我非常怀疑他试图做一件完全不同的事情