У меня возникла проблема при конвертации между этим типом 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