PHP преобразует строку в hex и hex в строку

У меня возникла проблема при конвертации между этим типом 2 в PHP. Это код, который я искал в google

function strToHex($string){ $hex=''; for ($i=0; $i < strlen($string); $i++){ $hex .= dechex(ord($string[$i])); } return $hex; } function hexToStr($hex){ $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2){ $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } 

Я проверяю его и узнаю об этом, когда я использую XOR для шифрования.

У меня есть строка "this is the test" , после XOR с ключом, у меня есть результат в строке ↕↑↔§P↔§P ♫§T↕§↕ . После этого я попытался преобразовать его в hex с помощью функции strToHex (), и я получил эти 12181d15501d15500e15541215712 . Затем я тестировал функцию hexToStr (), и у меня есть ↕↑↔§P↔§P♫§T↕§q . Итак, что мне делать, чтобы решить эту проблему? Почему это неправильно, когда я конвертирую это значение стиля 2?

Для любого символа с ord ($ char) <16 вы получаете обратно HEX, который длится всего 1. Вы забыли добавить 0 дополнений.

Это должно решить это:

 <?php function strToHex($string){ $hex = ''; for ($i=0; $i<strlen($string); $i++){ $ord = ord($string[$i]); $hexCode = dechex($ord); $hex .= substr('0'.$hexCode, -2); } return strToUpper($hex); } function hexToStr($hex){ $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2){ $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } // Tests header('Content-Type: text/plain'); function test($expected, $actual, $success) { if($expected !== $actual) { echo "Expected: '$expected'\n"; echo "Actual: '$actual'\n"; echo "\n"; $success = false; } return $success; } $success = true; $success = test('00', strToHex(hexToStr('00')), $success); $success = test('FF', strToHex(hexToStr('FF')), $success); $success = test('000102FF', strToHex(hexToStr('000102FF')), $success); $success = test('↕↑↔§P↔§P ♫§T↕§↕', hexToStr(strToHex('↕↑↔§P↔§P ♫§T↕§↕')), $success); echo $success ? "Success" : "\nFailed"; 

Вот что я использую:

 function strhex($string) { $hexstr = unpack('H*', $string); return array_shift($hexstr); } 

У меня есть только половина ответа, но я надеюсь, что это полезно, поскольку оно добавляет поддержку unicode (utf-8)

 //decimal to unicode character function unichr($dec) { if ($dec < 128) { $utf = chr($dec); } else if ($dec < 2048) { $utf = chr(192 + (($dec - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } else { $utf = chr(224 + (($dec - ($dec % 4096)) / 4096)); $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } return $utf; } 

Нанизывать

 var_dump(unichr(hexdec('e641'))); 

Источник: http://www.php.net/manual/en/function.chr.php#Hcom55978

 function hexToStr($hex){ // Remove spaces if the hex string has spaces $hex = str_replace(' ', '', $hex); return hex2bin($hex); } // Test it $hex = "53 44 43 30 30 32 30 30 30 31 37 33"; echo hexToStr($hex); // SDC002000173 /** * Test Hex To string with PHP UNIT * @param string $value * @return */ public function testHexToString() { $string = 'SDC002000173'; $hex = "53 44 43 30 30 32 30 30 30 31 37 33"; $result = hexToStr($hex); $this->assertEquals($result,$string); } 

PHP:

string to hex:

 implode(unpack("H*", $string)); 

hex для строки:

 pack("H*", $hex); 

Используя ответ @ bill-shirley с небольшим добавлением

 function str_to_hex($string) { $hexstr = unpack('H*', $string); return array_shift($hexstr); } function hex_to_str($string) { return hex2bin("$string"); } 

Применение:

  $str = "Go placidly amidst the noise"; $hexstr = str_to_hex($str);// 476f20706c616369646c7920616d6964737420746865206e6f697365 $strstr = hex_to_str($str);// Go placidly amidst the noise