C#里面的Convert.ToBase64String和php里面的base64_encode不一样

jin123456bat 发布于 2016/01/21 16:59
阅读 3K+
收藏 0

C#里面的Convert.ToBase64String(bytes[])  和 php里面的base64_encode的结果不一样

在VS中用C#编码前的数据

编码后的结果:CSfR3aHM6/0N+BZOmPH3yg==

在PHP中:

$a = '939209221161204235253132482278152241247202';

base64_encode($a) = 'OTM5MjA5MjIxMTYxMjA0MjM1MjUzMTMyNDgyMjc4MTUyMjQxMjQ3MjAy';

2次结果为什么不一样?在php中如何写出C#的那种代码?

加载中
1
bobdog1986
bobdog1986

http://php.net/manual/zh/function.base64-encode.php

这里面给了一个例子:

<?php
$str 
'This is an encoded string';
echo 
base64_encode($str);
?>

所以你的$a = '939209221161204235253132482278152241247202';

php程序里面会当做是一个字符串。而在c#里面,是一个byte[],所以你可以在c#里面先把那个byte[]转换成string,再在php里$a =c#里面的string,应该就正确了。

下面是c#把byte[]转换成string的方法,和你的编码是有关系的。

http://stackoverflow.com/questions/11654562/how-convert-byte-array-to-string

如果是用utf-8:

string convert = "This is the string to be converted";

// From string to byte array
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(convert);

// From byte array to string
string s = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);



0
bobdog1986
bobdog1986
虽然我不懂php,但是大哥,你这$a = '939209221161204235253132482278152241247202';什么玩意啊?!鬼知道byte[]都是对应的哪一个?你这样直接base64_encode($a),估计是当做9-3-9-2.....这样的byte[]了,你得先转换成正确的byte[]吧。就像c#里面一样
bobdog1986
bobdog1986
回复 @jin123456bat : 按我下面的方法,先把byte[]转换成string,在php里面$a=string;
j
jin123456bat
只是单纯的将bytes下数字进行拼接了一下
0
bobdog1986
bobdog1986
请php专家来帮你一下。@eechen
bobdog1986
bobdog1986
回复 @eechen : php里面byte[]和string转换不会?
eechen
eechen
CSharp那么高大上的语言,我这个PHP草根不会呀.
0
j
jin123456bat

引用来自“bobdog1986”的评论

http://php.net/manual/zh/function.base64-encode.php

这里面给了一个例子:

<?php
$str 
'This is an encoded string';
echo 
base64_encode($str);
?>

所以你的$a = '939209221161204235253132482278152241247202';

php程序里面会当做是一个字符串。而在c#里面,是一个byte[],所以你可以在c#里面先把那个byte[]转换成string,再在php里$a =c#里面的string,应该就正确了。

下面是c#把byte[]转换成string的方法,和你的编码是有关系的。

http://stackoverflow.com/questions/11654562/how-convert-byte-array-to-string

如果是用utf-8:

string convert = "This is the string to be converted";

// From string to byte array
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(convert);

// From byte array to string
string s = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);



假设我在php中获得到这样的数组

如何转化为字符串,可以直接base64加密使用?

j
jin123456bat
回复 @bobdog1986 :C#的数据来源就是byte[],因为C#中的一些算法和php中的不太一样,在php中我改造了一些,php中可以获取到类似的一个数组,只是类型是字符串,现在就是卡在类型转换上面了,不然没办法经base64的
bobdog1986
bobdog1986
回复 @jin123456bat : 你原文c#里是一个byte[]{9,39,......},但php里是string=“939...”,这俩根本就不是一回事好吗!!你首先都做成一个类型,c#里面最早的数据来源也是byte[]吗?还是1个string但是你给转换成byte[]?这就涉及编码方式了,来回转换是要有编码类型要求的。
j
jin123456bat
回复 @bobdog1986 : 这个只是获取字符的ascii码啊,在c#中数据表现为十进制,PHP中我获取到的是字符串,C#的Convert.ToBase64String的行为是将十进制字节流转化为字符串在进行base64编码?
bobdog1986
bobdog1986
http://stackoverflow.com/questions/885597/string-to-byte-array-in-php 你能自己找找吗?随便一搜都能找到的。 另外,你这是ascII格式吗?在c#里面转成string?还是php?
0
eechen
eechen
@bobdog1986 不知道下面这个是不是你要的所谓的字节数组
<?php
$str = 'abc';
$arr = array();
$len = strlen($str);
for($i=0;$i<$len;$i++) {
    $arr[$i] = ord($str[$i]); //返回字符ASCII码
}
print_r($arr);
//输出:
Array
(
    [0] => 97
    [1] => 98
    [2] => 99
)
bobdog1986
bobdog1986
回复 @jin123456bat : 比如,按照ascII编码格式,数字97对应char ‘0’,而不是char'97'。c#里面byte[0]=9,不能直接转换成字符串“9”懂吗?!根本不是一回事
bobdog1986
bobdog1986
回复 @jin123456bat : 他这个代码是string转换成byte[],是ASCII编码方式。你能自己先搞清楚数据类型吗?byte[]和string,你在c#里面是用的byte[],但是php里面用的string,而且你竟然将byte值从头到尾拼接成string!!
j
jin123456bat
你的意思是我直接将ascii码转化为字符串然后再base64_encode?
0
0
j
jin123456bat

引用来自“eechen”的评论

@bobdog1986 不知道下面这个是不是你要的所谓的字节数组
<?php
$str = 'abc';
$arr = array();
$len = strlen($str);
for($i=0;$i<$len;$i++) {
    $arr[$i] = ord($str[$i]); //返回字符ASCII码
}
print_r($arr);
//输出:
Array
(
    [0] => 97
    [1] => 98
    [2] => 99
)
太帅了!刚才误打误撞的解决掉了!我从base64后的字符串解码得到原字符串,居然是一段乱码,然后异想天开的将php中的字符串看作ascii码,转化为对应的字符串,结果虽然都是乱码但是最终结果却是一样的,进过base64_encode之后和c#中的Convert.ToBase64String算法得到的结果一致,太感谢了
返回顶部
顶部