php 16进制 带0x,php端接收到的来自Javascript的Latin1编码长度变长了,转为16进制时发现多了0xC2,0xC3等...

<html>

<script src="web/js/sha1.js" type="text/javascript"></script>

<script>

var sha1=CryptoJS.SHA1("abc");

document.write("sha1:",sha1);

document.write("<br>");

var sha1_Latin=sha1.toString(CryptoJS.enc.Latin1);

document.write("sha1_Latin:",sha1_Latin);

document.write("Latin.len:",sha1_Latin.length);

document.write("<br>");

var sha1_hex=strToHex(sha1_Latin);//此处为自己定义的一个函数,将字符串转换为ASCII的16进制形式

document.write("hex:",sha1_hex);

document.write("<br>");

var xmlhttp1;

if (window.XMLHttpRequest)

{

xmlhttp1=new XMLHttpRequest();

}

else

{

xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");

}

xmlhttp1.open("GET","web/tes.php?sha1_html="+sha1_Latin,false);//发送G给服务器

xmlhttp1.send();

document.write(xmlhttp1.responseText);

</script>

</html>

<?php

$username_php=$_GET['sha1_html'];

cho "true";

echo '<br/>';

echo $username_php;

echo '<br/>';

echo strlen($username_php);

echo '<br/>';

echo bin2hex($username_php);

echo '<br/>';

?>

该代码JS端自主输出的

sha1_Latin:©>6Gjº>%qxPÂlÐØ / /此段为sha1(“abc”)生成的字符串

Latin.len:20

hex:a9993e364706816aba3e25717850c26c9cd0d89d//此段为sha1_Latin的16进制字符串形式,可以确定此处的hex转换是正确的

而通过AJAX传输到php后在浏览器端输出的

©>6Gjº>%qxPÂlÐØ //此处看着仍和前面的sha1_Latin对应

29//此处的长度不对应了

c2a9c2993e364706c2816ac2ba3e25717850c3826cc29cc390c398c29d//转换为16进制发现和前面的hex不一样,观察发现多了一些c2,c3,请问是为什么?????

因为字符串被转码成别的编码了。你有没有发现前面添加

c2

c3

的都是那些大于等于

0x80

的编码字符?

解决方法,设置页面编码、传输编码、PHP接收编码一致,都为

Latin1

,以防止浏览器或PHP自动转码

为什么不传

a9993e364706816aba3e25717850c26c9cd0d89d

这个字符串呢?

xmlhttp1.open("GET","web/tes.php?sha1_html="+sha1_hex,false);//发送G给服务器

xmlhttp1.send();

document.write(xmlhttp1.responseText);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值