如何解码十六进制内容?

时间:2013-04-18 18:08:34

标签: php

我有$ _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

3 个答案:

答案 0 :(得分:1)

您是否尝试过相当于chr()的unicode? 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

答案 1 :(得分:1)

使用utf8_encode后,您现在拥有一个多字节字符串。这意味着您需要使用PHP的multibyte (mb_)函数。

因此,str_split将不再有效。您需要将mb_splitpreg_splitu标记一起使用。

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

这是一个演示,表明您的代码现在正在运行:http://ideone.com/nqeC0U

答案 2 :(得分:0)

您的输入是UTF-8,使用该转换类似于utf8_decode,它将转换为ISO-8859-1。 UTF-8虽然支持比ISO-8859-1更多的字符。这就是为什么xC4会显示为你的问号。

尝试使用像iconv这样功能更强大的东西。