Преобразовать строку в число и обратно в строку?

Я хотел бы знать, как я могу преобразовать короткую строку ASCII в число (int, float или numeric string). Я видел пару сообщений, здесь упомянутых совершенных хэшей, которые, похоже, могут быть то, что мне нужно . Однако я не совсем понимаю эту математику.

Как можно преобразовать строку 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 { 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); 

Кодер с номером-номером как однострочный (стиль PHP 5.3):

 $numbers = join(array_map(function ($n) { return sprintf('%03d', $n); }, unpack('C*', $str))); 

Он просто преобразует каждый байт в его десятичное число, эквивалентное нулю, заполняя его до фиксированной длины в 3 цифры, чтобы его можно было однозначно преобразовать обратно.

Декодер возвращается к строке:

 $str = join(array_map('chr', str_split($numbers, 3))); 

Пример текста:

Wörks все все ス ト リ ン グ ズ
087195182114107115032119195173116104032097108108032227130185227131136227131170227131179227130176227130186

Вы не можете просто вводить символы ORD в строку чисел и ожидать, что она вернется, потому что некоторые символы могут быть на 2 символа и другие 3.

Например:

Кан-Хо даст вам: 10797106103457279

Теперь, как вы знаете, это не так: 10-79-71-0-61-0-34-57-27-9?

Вам нужно либо заполнить все свои номера тремя кодами, и получить: 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; } 

Вы можете использовать созданную вами функцию в сочетании с этим, и для восстановления строки возьмите блок из 3 целых чисел и преобразуйте их обратно в соответствующий символ ASCII.

 foreach(str_split($numberSeq, 3) as $asciiIntValue) $stringBack .= chr($asciiIntValue);