首页 新闻 会员 周边

请教PHP函数用.net重写的问题

0
悬赏园豆:100 [待解决问题]

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

但是解析出来的结果不一样 已经纠结了两三天了  求指导 

笨猪青菜的主页 笨猪青菜 | 初学一级 | 园豆:100
提问于:2012-03-09 13:57
< >
分享
所有回答(2)
0
初步推测,是由于linux、window的对编码UCS-2理解不同造成的。
vRc_vBYSvvo1vBYjvR6nvRY2xxoCvRwtvwU0wBUlwPc4wB,HxxoCvPscvhIovQwUwPcfvBYjvQscvOoNvxgcCJWmvx6pvQI4这个参数,运行php函数得到的结果是”广东省中山市,德秀路附近,坦洲实险中学北约180米处“,但在C#中得到的是乱码。
我估计这个参数是在php中生成的,我建议你先把生成参数的方法用C#重写一下,看相同的汉字能否得到相同的参数。
walen | 园豆:429 (菜鸟二级) | 2012-03-09 15:17

谢谢您的回复,这个参数在.net环境和php环境中是一样的,我多次对比过。不过我是在vs环境中调试的PHP,而且我单步调试这两个函数,运行中变量都一样,就是在chr()和(char)转换的地方不一样了!不知道是不是php中的chr()函数不能用.net中的(char)简单替代!纠结好几天了!

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-09 15:23

@笨猪青菜: 最后得到的变量f是一样的,说明char是没有问题的,还是编码的问题。

vRc_vBYSvvo1vBYjvR6nvRY2xxoCvRwtvwU0wBUlwPc4wB,HxxoCvPscvhIovQwUwPcfvBYjvQscvOoNvxgcCJWmvx6pvQI4” 这个参数是在什么平台下生成的?

支持(0) 反对(0) walen | 园豆:429 (菜鸟二级) | 2012-03-09 15:30

@walen: 这个字符串在php环境中和.net环境中都一样,我是在vs中调试.net和php的。现在操作系统win7 64位。变量没变是说在进行(char)转换之前都一样,但是在进行char转换之后,就和php的chr()结果不一样了!我这里调试,.net环境中,能正常显示一部分汉字,但是有一部分是乱码!“广东省中山市㼌弿礿㼿㽄㼿㼌坦洲嬿㽩中学北��?80米处”

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-09 15:46

@笨猪青菜: 我调试了下 char确实有问题。

支持(0) 反对(0) walen | 园豆:429 (菜鸟二级) | 2012-03-09 15:51

@walen: 嗯,是的,谢谢您耐心帮助,那您知道是什么原因吗?

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-09 15:57

@笨猪青菜: 还是编码的问题,与char无关。

Encoding.Default.GetBytes("广东省中山市,德秀路附近,坦洲实险中学北约180米处")

Encoding.Default.GetBytes(f.ToString())

这两方法得到的byte数组个数都不是一样的。

还是建议你把生成参数的方法重写先。

支持(0) 反对(0) walen | 园豆:429 (菜鸟二级) | 2012-03-09 17:42

@walen: 嗯,是的,我也发现变量"f”在生成的时候就已经有问题了,在和PHP代码调试对比中,f在开始几位生成的还是正确的,但是在中间的时候,char()转换后的字符就和php的chr转换之后的不一样了,但是我不知道怎么改,这个是从PHP一点一点对比着重写的!

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-09 17:50

@walen: 而且要转换的参数在进入.net的char()转换之前,和PHP是一样的,但是经过char()转换之后,就不一样了!

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-09 17:52
0

PHP中与.net中的数据对齐可能不一样(二进制格式的)

az235 | 园豆:8483 (大侠五级) | 2012-03-12 08:56

嗯,有可能,现在不知道怎么改了!

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-13 08:56

@笨猪青菜: 可以查看下他们的地址,然后再来分析下

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-03-13 08:59

@az235: 我加你QQ可以么 嘿嘿

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-13 10:17

@笨猪青菜: 我这上不了qq,被封了:(

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-03-13 10:24

@az235: 汗  折腾 呵呵

支持(0) 反对(0) 笨猪青菜 | 园豆:100 (初学一级) | 2012-03-13 11:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册