PHP代码:
function decodeaddr($p)
{
$a = 0;
$s = 0;
$d = strlen($p);
$f = "";
$g = -1;
$h = 0;
$count = 0;
for ($j = 0; $j < $d; $j++) {
//for ($j = 20; $j < $d; $j++) {
$k = ord($p[$j]);
$k = ($k == 95) ? 63 : (($k == 44) ? 62 : (($k >= 97) ? ($k - 61) : (($k >= 65) ? ($k - 55) : ($k - 48))));
$s = ($s *LT_count2n(6) ) + $k;
$a += 6;
while ($a >= 8)
{
$l = (int)($s / LT_count2n( ($a - 8) ) );
if ($h > 0)
{
$g = ($g *LT_count2n(6) ) + ($l & (0x3f));
$h--;
if ($h == 0)
{
$f .= chr($g%256);
$f .= chr($g/256);
//echo $g."<br />";
}
} else {
if ($l >= 224) {
$g = $l & (0xf);
$h = 2;
} else if ($l >= 128) {
$g = $l & (0x1f);
$h = 1;
} else {
$f .= chr($l%256);
$f .= chr($l/256);
// echo $l."<br />";
};
};
$s = $s - ($l *LT_count2n( ($a - 8) ) );
$a -= 8;
};
};
return iconv('UCS-2LE','UTF-8', $f);
};
function LT_count2n($n)
{
$i=1;
$num = 1;
while($i<=$n)
{
$num = $num * 2;
$i++;
}
return $num;
}
重写的.net代码:
private string DecodeAddr(string p)
{
int a = 0;
int s = 0;
int d = p.Length;
StringBuilder f = new StringBuilder();
int g = -1;
int h = 0;
int count = 0;
int i = 0;
//int k = 0;
Encoding UCS2 = Encoding.GetEncoding("UCS-2");
// for (int j = 20; j < d; j++)
for (int j = 0; j < d; j++)
{
int k = Convert.ToInt32(p[j]);
k = (k == 95) ? 63 : ((k == 44) ? 62 : ((k >= 97) ? (k - 61) : ((k >= 65) ? (k - 55) : (k - 48))));
s = (s * Count2n(6)) + k;
a += 6;
while (a >= 8)
{
i = (int)(s / Count2n((a - 8)));
if (h > 0)
{
g = (g * Count2n(6)) + (i & (0x3f));
h--;
if (h == 0)
{
f.Append((char)(g % 256));
f.Append((char)(g / 256));
}
}
else
{
if (i >= 224)
{
g = i & (0xf);
h = 2;
}
else if (i >= 128)
{
g = i & (i % 0x1f);
h = 1;
}
else
{
f.Append((char)(i % 256));
f.Append((char)(i / 256));
}
}
s = s - (i * Count2n((a - 8)));
a -= 8;
}
}
return Encoding.Default.GetString(Encoding.Convert(Encoding.GetEncoding("UCS-2"), Encoding.UTF8, Encoding.UTF8.GetBytes(f.ToString())));
}
private int Count2n(int num)
{
int i = 1;
int number = 1;
while (i <= num)
{
number = number * 2;
i++;
}
return number;
}
其中两个函数参数都为:vRc_vBYSvvo1vBYjvR6nvRY2xxoCvRwtvwU0wBUlwPc4wB,HxxoCvPscvhIovQwUwPcfvBYjvQscvOoNvxgcCJWmvx6pvQI4
但是解析出来的结果不一样 已经纠结了两三天了 求指导
初步推测,是由于linux、window的对编码UCS-2理解不同造成的。
vRc_vBYSvvo1vBYjvR6nvRY2xxoCvRwtvwU0wBUlwPc4wB,HxxoCvPscvhIovQwUwPcfvBYjvQscvOoNvxgcCJWmvx6pvQI4这个参数,运行php函数得到的结果是”广东省中山市,德秀路附近,坦洲实险中学北约180米处“,但在C#中得到的是乱码。
我估计这个参数是在php中生成的,我建议你先把生成参数的方法用C#重写一下,看相同的汉字能否得到相同的参数。
谢谢您的回复,这个参数在.net环境和php环境中是一样的,我多次对比过。不过我是在vs环境中调试的PHP,而且我单步调试这两个函数,运行中变量都一样,就是在chr()和(char)转换的地方不一样了!不知道是不是php中的chr()函数不能用.net中的(char)简单替代!纠结好几天了!
@笨猪青菜: 最后得到的变量f是一样的,说明char是没有问题的,还是编码的问题。
“vRc_vBYSvvo1vBYjvR6nvRY2xxoCvRwtvwU0wBUlwPc4wB,HxxoCvPscvhIovQwUwPcfvBYjvQscvOoNvxgcCJWmvx6pvQI4” 这个参数是在什么平台下生成的?
@walen: 这个字符串在php环境中和.net环境中都一样,我是在vs中调试.net和php的。现在操作系统win7 64位。变量没变是说在进行(char)转换之前都一样,但是在进行char转换之后,就和php的chr()结果不一样了!我这里调试,.net环境中,能正常显示一部分汉字,但是有一部分是乱码!“广东省中山市㼌弿礿㼿㽄㼿㼌坦洲嬿㽩中学北��?80米处”
@笨猪青菜: 我调试了下 char确实有问题。
@walen: 嗯,是的,谢谢您耐心帮助,那您知道是什么原因吗?
@笨猪青菜: 还是编码的问题,与char无关。
Encoding.Default.GetBytes("广东省中山市,德秀路附近,坦洲实险中学北约180米处")
Encoding.Default.GetBytes(f.ToString())
这两方法得到的byte数组个数都不是一样的。
还是建议你把生成参数的方法重写先。
@walen: 嗯,是的,我也发现变量"f”在生成的时候就已经有问题了,在和PHP代码调试对比中,f在开始几位生成的还是正确的,但是在中间的时候,char()转换后的字符就和php的chr转换之后的不一样了,但是我不知道怎么改,这个是从PHP一点一点对比着重写的!
@walen: 而且要转换的参数在进入.net的char()转换之前,和PHP是一样的,但是经过char()转换之后,就不一样了!
PHP中与.net中的数据对齐可能不一样(二进制格式的)
嗯,有可能,现在不知道怎么改了!
@笨猪青菜: 可以查看下他们的地址,然后再来分析下
@az235: 我加你QQ可以么 嘿嘿
@笨猪青菜: 我这上不了qq,被封了:(
@az235: 汗 折腾 呵呵