2016-06-28 293 views
0

我想计算一个字符串所包含的位数。 Pickle是我不知道“它是什么类型的字符串”,假设它的用户输入。由于strlen()返回string所拥有的字节数,我们可以简单地乘以8,但如果它提供了sha256散列(当raw为64位字符时为256位),该怎么办呢?在这里应用strlen()* 8逻辑会给我512位。计算字符串中的位数

因此,这里是我的解决方法:

private function countBits(string $key) : int 
{ 
    $bits = (ctype_xdigit($key)) ? 4 : 8; 
    return strlen($key)*$bits; 
} 

因此是计算该字符串包含的位数是正确的方法是什么?我的意思是如果字符串不是完全由六进制组成的,那么它应该总是乘以8,对吧?或者还有一些收获?

+1

字符串中的位数完全取决于其长度(以字节为单位),而不是通过解释其内容....您将一组字符(1-9/af)解释为表示位,但是字符串不知道或者关心那个解释 –

+0

函数之后是什么':int'? – Drone

+2

@babuji - 返回类型提示 –

回答

0

由于内部大小为256位,但块大小为512位。

简单expirement

<?php 

$string = 'test'; 
$key = hash('sha256',$string); 
$value = bin2hex($key); 



function str_baseconvert($str, $frombase=10, $tobase=36) { 
    $str = trim($str); 
    if (intval($frombase) != 10) { 
     $len = strlen($str); 
     $q = 0; 
     for ($i=0; $i<$len; $i++) { 
      $r = base_convert($str[$i], $frombase, 10); 
      $q = bcadd(bcmul($q, $frombase), $r); 
     } 
    } 
    else $q = $str; 

    if (intval($tobase) != 10) { 
     $s = ''; 
     while (bccomp($q, '0', 0) > 0) { 
      $r = intval(bcmod($q, $tobase)); 
      $s = base_convert($r, 10, $tobase) . $s; 
      $q = bcdiv($q, $tobase, 0); 
     } 
    } 
    else $s = $q; 

    return $s; 
} 

var_dump(str_baseconvert($key,16,2)); 
var_dump(strlen($key)*8); 

第一码返回返回长度碎甲弹,在串 二次代码返回长度的比特。 http://sandbox.onlinephpfunctions.com/code/777ac7c4528357ee21426ad7cab6dcdbdd00edf0 你可以看到这是链接的例子。

+0

该功能必须从/到/从基地提供。我正在查看是否有可能转换用户提供的字符串,这可能与@deceze指出的不同 –