Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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_String_Encoding_Perfect Hash - Fatal编程技术网

Php 将字符串转换为数字并返回字符串?

Php 将字符串转换为数字并返回字符串?,php,string,encoding,perfect-hash,Php,String,Encoding,Perfect Hash,我想知道如何将短ASCII字符串转换为数字(int、float或数字字符串)。我看到了几张上面提到的照片,看起来很像。然而,我不太理解这方面的数学 如何将ASCII字符串转换为数字序列,然后再转换回字符串? 作为旁注,将字符串分解为ASCII字符数非常容易 foreach(str_split($string) as $char) $number .= ord($char); 更新 经过更多的阅读,我想出了这个。然而,我想知道是否有任何方法可以缩短数字序列,使其不那么长 class intnum

我想知道如何将短ASCII字符串转换为数字(int、float或数字字符串)。我看到了几张上面提到的照片,看起来很像。然而,我不太理解这方面的数学

如何将ASCII字符串转换为数字序列,然后再转换回字符串?

作为旁注,将字符串分解为ASCII字符数非常容易

foreach(str_split($string) as $char) $number .= ord($char);
更新 经过更多的阅读,我想出了这个。然而,我想知道是否有任何方法可以缩短数字序列,使其不那么长

class intnum
{
    public static $charset = array(
        32 => ' ', 33 => '!', 34 => '"', 35 => '#', 36 => '$',
        37 => '%', 38 => '&', 39 => "'", 40 => '(', 41 => ')',
        42 => '*', 43 => '+', 44 => ',', 45 => '-', 46 => '.',
        47 => '/', 48 => '0', 49 => '1', 50 => '2', 51 => '3',
        52 => '4', 53 => '5', 54 => '6', 55 => '7', 56 => '8',
        57 => '9', 58 => ':', 59 => ';', 60 => '<', 61 => '=',
        62 => '>', 63 => '?', 64 => '@', 65 => 'A', 66 => 'B',
        67 => 'C', 68 => 'D', 69 => 'E', 70 => 'F', 71 => 'G',
        72 => 'H', 73 => 'I', 74 => 'J', 75 => 'K', 76 => 'L',
        77 => 'M', 78 => 'N', 79 => 'O', 80 => 'P', 81 => 'Q',
        82 => 'R', 83 => 'S', 84 => 'T', 85 => 'U', 86 => 'V',
        87 => 'W', 88 => 'X', 89 => 'Y', 90 => 'Z', 91 => '[',
        92 => '\\', 93 => ']', 94 => '^', 95 => '_', 96 => '`',
        97 => 'a', 98 => 'b', 99 => 'c', 100 => 'd', 101 => 'e',
        102 => 'f', 103 => 'g', 104 => 'h', 105 => 'i', 106 => 'j',
        107 => 'k', 108 => 'l', 109 => 'm', 110 => 'n', 111 => 'o',
        112 => 'p', 113 => 'q', 114 => 'r', 115 => 's', 116 => 't',
        117 => 'u', 118 => 'v', 119 => 'w', 120 => 'x', 121 => 'y',
        122 => 'z', 123 => '{', 124 => '|', 125 => '}'
    );

    public static function fromNumber($number)
    {
        $string = '';
        while($number)
        {
            $value = substr($number, 0, 2);
            $number = substr($number, 2);

            if($value < 32)
            {
                $value .= substr($number, 0, 1);
                $number = substr($number, 1);
            }

            $string .= self::$charset[ (int) $value];
        }
        return $string;
    }

    public static function fromString($string)
    {
        $number = '';
        foreach(str_split($string) as $char) $number .= ord($char);
        return $number;
    }
}

$string = 'this is my test string to convert';

$number = intnum::fromString($string);
$string = intnum::fromNumber($number);
class intnum
{
公共静态$charset=array(
32 => ' ', 33 => '!', 34 => '"', 35 => '#', 36 => '$',
37 => '%', 38 => '&', 39 => "'", 40 => '(', 41 => ')',
42 => '*', 43 => '+', 44 => ',', 45 => '-', 46 => '.',
47 => '/', 48 => '0', 49 => '1', 50 => '2', 51 => '3',
52 => '4', 53 => '5', 54 => '6', 55 => '7', 56 => '8',
57=>'9',58=>':',59=>';',60=>'',63=>'?',64=>'@',65=>'A',66=>'B',
67=>‘C’,68=>‘D’,69=>‘E’,70=>‘F’,71=>‘G’,
72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',
77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',
82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',
87=>W',88=>X',89=>Y',90=>Z',91=>,
92 => '\\', 93 => ']', 94 => '^', 95 => '_', 96 => '`',
97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',
102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',
107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',
112=>‘p’,113=>‘q’,114=>‘r’,115=>‘s’,116=>‘t’,
117=>‘u’,118=>‘v’,119=>‘w’,120=>‘x’,121=>‘y’,
122=>'z',123=>'{',124=>'|',125=>'}'
);
公共静态函数fromNumber($number)
{
$string='';
while($number)
{
$value=substr($number,0,2);
$number=substr($number,2);
如果($value<32)
{
$value.=substr($number,0,1);
$number=substr($number,1);
}
$string.=self::$charset[(int)$value];
}
返回$string;
}
公共静态函数fromString($string)
{
$number='';
foreach(str_split($string)作为$char)$number.=ord($char);
返回$number;
}
}
$string='这是我要转换的测试字符串';
$number=intnum::fromString($string);
$string=intnum::fromNumber($number);

您不能只将字符ORD转换成一个数字字符串,然后期望它返回,因为有些字符可能包含2个字符,而另一些字符包含3个字符

例如:

康和会给你:10797106103457279

现在你怎么知道不是:10-79-71-0-61-0-34-57-27-9

您需要将所有数字填入3个数字代码,从而获得:107097106103045072079
然后把它分成3个数字块,然后再把它们放回去……

好吧,如果你想把字符串转换成一个整数序列,你必须始终使用一个固定的数字块。在这种情况下,3因为ASCII使用8位字,所以最大可能的整数是2^8-1=255

应使用0填充未分配的空间:

function zero_fill($num){
    if($num <= 9) $num = "00".$num;
    elseif($num <= 99) $num = "0".$num;
    return $num;
}

一个字符串到数字编码器作为一个线性行(PHP 5.3样式):

它只需将每个字节转换为十进制数,将其零填充为固定长度的3位数字,以便可以毫不含糊地转换回

解码器将返回到字符串:

$str = implode(array_map('chr', str_split($numbers, 3)));
示例文本:

Wörks Wíth allストリングズ
0871951821141071150321191951731161040320971081080322713018522711311362271170227117922713010701762271301186


为什么不使用你刚刚发布的代码?@Brad,我如何取回字符串?@PhilLello,你有没有办法用十六进制修改我上面的代码?嗯,似乎无法使用你提供的unicode字符。只要你确保用与输入相同的编码解释结果,就可以正常工作。请参阅(以PHP5.2风格编写,因为Codepad还没有运行5.3)。“11位单词”?2^11-1=127?我想你在这方面有点出轨了。我也正要编写它,2^11=2048…你的意思是2^7,但ASCII有255个字符,所以是2^8。。。
$numbers = implode(array_map(function ($n) { return sprintf('%03d', $n); },
                          unpack('C*', $str)));
$str = implode(array_map('chr', str_split($numbers, 3)));