2013-02-03 105 views
24

Tôi gặp sự cố khi chuyển đổi giữa loại 2 này trong PHP. Đây là mã tôi đã tìm kiếm trong googleChuỗi chuyển đổi PHP thành hex và hex thành chuỗi

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

Tôi kiểm tra và phát hiện ra điều này khi tôi sử dụng XOR để mã hóa.

Tôi có chuỗi "this is the test", sau khi XOR có khóa, tôi có kết quả là chuỗi ↕↑↔§P↔§P ♫§T↕§↕. Sau đó, tôi đã cố gắng chuyển nó thành hex bằng hàm strToHex() và tôi nhận được các số 12181d15501d15500e15541215712. Sau đó, tôi đã thử nghiệm với hàm hexToStr() và tôi có ↕↑↔§P↔§P♫§T↕§q. Vì vậy, tôi nên làm gì để giải quyết vấn đề này? Tại sao nó sai khi tôi chuyển đổi giá trị kiểu 2 này?

+4

Bạn biết có những 'HEX2BIN() 'và' BIN2HEX() 'trong PHP? – SparKot

+0

* strToHex * trả về một * chuỗi * của hex - vì vậy nếu bạn XOR trực tiếp với toán tử '^', điều đó sẽ không cho kết quả tốt. Có lẽ bạn có thể cho * strToHex * một tham số khác là số bạn muốn XOR, và XOR trực tiếp bên trong hàm đó: '$ hex. = Dechex (ord ($ string [$ i])^$ MYKEYBYTE); ' –

+0

Tôi nghĩ vấn đề là ở hàm hexToStr(). Bởi vì khi nó chuyển đổi thành chuỗi, nó vượt qua không gian hoặc một số ký tự đặc biệt, và làm cho vấn đề – JoeNguyen

Trả lời

41

Đối với bất kỳ char nào có lệnh ($ char) < 16, bạn sẽ nhận được một khoản tiền HEX chỉ dài 1 lần. Bạn đã quên thêm 0 phần đệm.

này nên giải quyết nó:

<?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

Trong hàm strToHex, như là một thay thế cho toàn bộ dechex() và substr -2, ta chỉ có thể sử dụng: '$ hex. = Sprintf ('% 02.x', $ ord); ' – tropicalm

+0

Nó không hoạt động cho UTF -8 ký tự –

0

tôi chỉ có một nửa câu trả lời, nhưng tôi hy vọng rằng nó rất hữu ích vì nó cho biết thêm unicode (-8 utf) hỗ trợ

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

Để chuỗi

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

Nguồn: http://www.php.net/manual/en/function.chr.php#Hcom55978

13

Đây là những gì tôi sử dụng:

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:

chuỗi hex:

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

hex để chuỗi:

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

Sử dụng @ hóa đơn shirley trả lời với một chút bổ sung

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

Cách sử dụng:

$str = "Go placidly amidst the noise"; 
    $hexstr = str_to_hex($str);// 476f20706c616369646c7920616d6964737420746865206e6f697365 
    $strstr = hex_to_str($str);// Go placidly amidst the noise 
Các vấn đề liên quan