2013-04-18 219 views
2

我有$ _SERVER ['REDIRECT_SSL_CLIENT_S_DN']有一些十六進制數據的內容。我如何解碼它?如何解碼十六進制內容?

$_SERVER['REDIRECT_SSL_CLIENT_S_DN'] = '../CN=\x00M\x00\xC4\x00,\x00I\x00S\x00,\x004\x000\x003\x001\x002\x000\x000\x002/SN=..'; 
$pattern = '/CN=(.*)\\/SN=/'; 
preg_match($pattern, $_SERVER['REDIRECT_SSL_CLIENT_S_DN'], $server_matches); 
print_r($server_matches[1]); 

結果是:

\x00M\x00\xC4\x00,\x00I\x00S\x00,\x004\x000\x003\x001\x002\x000\x000\x002

結果我需要的是:

MÄ,IS,40312002

我試圖把它與chr(hexdec($value));解碼和它差不多的作品,但在HTML輸入我看到很多問號。

編輯: 附加測試結果。還不完美。陣列顯示一些錯誤:http://pastebin.com/BC4xxqmE

+0

爲什麼有這麼多'\ x00's? –

+2

嘗試'utf8_encode(chr(hexdec($ value)));'。 –

+0

@RocketHazmat幾乎可以工作,但數組顯示出一些奇怪的值。看看我的pastebin鏈接。 – Bob0101

回答

1

使用utf8_encode,你現在有一個多字節字符串。這意味着您需要使用PHP的multibyte (mb_)函數。

因此,str_split將不再工作。您需要將mb_splitpreg_splitu標誌一起使用。

$splitted = preg_split('//u', $string); 

這裏的演示表明你的代碼是現在的工作:http://ideone.com/nqeC0U

+0

問題解決!謝謝 – Bob0101

+0

@ Bob0101:不客氣。很高興我能幫上忙! :-D –

0

您的輸入是UTF-8,使用該轉換類似於將轉換爲ISO-8859-1的utf8_decode。雖然UTF-8支持比ISO-8859-1更多的字符。這就是爲什麼xC4顯示爲您的問號。

嘗試使用像iconv這樣更強大的功能。

1

你有沒有嘗試unicode相當於chr()? chr mod 256所有的輸入,這就是爲什麼你看到所有這些問號。

下面的代碼是從CHR PHP手冊柱的一個

function unichr($u) { 
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES'); 
} 

更新

//New function 
function unichr($intval) { 
return mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE'); 
} 

我與XC4 = 196測試它給我一個Ä

http://codepad.viper-7.com/3htuwW

+0

我試過了。返回一個空值。 – Bob0101

+0

嘗試新功能 –