2013-02-03 437 views
24

我在PHP中使用這兩種類型之間的轉換時遇到了問題。這是我在谷歌搜索代碼PHP將字符串轉換爲十六進制和十六進制字符串

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

我檢查它,並發現這一點,當我使用異或加密。

我有字符串"this is the test",在與一個鍵異或之後,我得到了字符串↕↑↔§P↔§P ♫§T↕§↕的結果。之後,我嘗試通過函數strToHex()將其轉換爲十六進制,並且我得到了這些12181d15501d15500e15541215712。然後,我用函數hexToStr()進行測試,我有↕↑↔§P↔§P♫§T↕§q。那麼,我該怎麼做才能解決這個問題呢?爲什麼當我轉換這個2樣式值時會出錯?

+4

你知道有'HEX2BIN()'和'BIN2HEX()'在PHP? – SparKot

+0

* strToHex *返回一個十六進制的*字符串*,所以如果直接使用'^'運算符進行XOR運算,則不會給出任何好結果。也許你可以給* strToHex *另一個參數,它是你想和XOR進行比較的數字,XOR直接在該函數中:'$ hex。= dechex(ord($ string [$ i])^ $ MYKEYBYTE);' –

+0

我想問題在於hexToStr()函數。因爲當它轉換爲字符串時,它傳遞空格或一些特殊字符,並使問題 – JoeNguyen

回答

41

對於任何帶ord的字符($ char)< 16您將得到一個只有1長的HEX。你忘了添加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"; 
+0

在strToHex函數中,作爲整個dechex()和substr -2的替代,可以使用:'$ hex。= sprintf('%02.x',$ ord);' – tropicalm

+0

它不適用於UTF -8個字符 –

0

我只有一半的答案,但我希望它是有用的,因爲它增加的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

13

這是我使用:

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:

字符串爲十六進制:

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

十六進制字符串:

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

使用@法案 - 雪莉回答一點點補充

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 
相關問題