2013-02-03 5 views
24

Ho riscontrato il problema durante la conversione tra questo 2 tipo in PHP. Questo è il codice che ho cercato in GooglePHP converte stringa in esadecimale e esadecimale in stringa

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; 
} 

lo controllo e scoperto questo quando uso XOR per criptare.

Ho la stringa "this is the test", dopo XOR con una chiave, ho il risultato nella stringa ↕↑↔§P↔§P ♫§T↕§↕. Dopo ciò, ho provato a convertirlo in esadecimale tramite la funzione strToHex() e ho ottenuto questi 12181d15501d15500e15541215712. Quindi, ho provato con la funzione hexToStr() e ho ↕↑↔§P↔§P♫§T↕§q. Quindi, cosa dovrei fare per risolvere questo problema? Perché sbaglia quando converto questo valore in 2 stili?

+4

Sai che ci sono 'HEX2BIN()' e 'BIN2HEX()' in PHP? – SparKot

+0

* strToHex * restituisce una * stringa * di hex - quindi se si XOR direttamente con l'operatore '^', questo non darà alcun risultato positivo. Forse potresti dare * strToHex * un altro parametro è il numero con cui vuoi XOR, e XOR direttamente all'interno di quella funzione: '$ hex. = Dechex (ord ($ stringa [$ i])^$ MYKEYBYTE);' –

+0

Ho pensato che il problema è nella funzione hexToStr(). Perché quando si converte in stringa, passa lo spazio o qualche carattere speciale e crea il problema – JoeNguyen

risposta

41

Per qualsiasi carattere con ord ($ char) < 16 si ottiene un HEX back che è lungo solo 1. Hai dimenticato di aggiungere 0 padding.

Questo dovrebbe risolverlo:

<?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"; 
+0

Nella funzione strToHex, in alternativa all'intero dechex() e substr -2, si può semplicemente usare: '$ hex. = Sprintf ('% 02.x', $ ord);' – tropicalm

+0

Non funziona con UTF -8 caratteri –

0

ho solo la metà della risposta, ma spero che sia utile in quanto aggiunge unicode (UTF-8) sostegno

//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; 
} 

a STRING

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

Fonte: http://www.php.net/manual/en/function.chr.php#Hcom55978

13

Ecco quello che uso:

function strhex($string) { 
    $hexstr = unpack('H*', $string); 
    return array_shift($hexstr); 
} 
1
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); 
} 
3

PHP:

stringa esadecimale:

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

esadecimale a stringa:

pack("H*", $hex); 
0

Utilizzando @ bill-shirley rispondi con una piccola aggiunta

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

Usage:

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