问题描述:最近想把一段PHP代码改写成C#,过程中遇上把数据流写入文件,来生成图片的代码。PHP生成的图片没有问题,而C#生成的却是无效图片格式。个人怀疑是如下两个原因之一,望各位老师不吝赐教。怀疑 1. 下面的代码改写不正确
/// <summary>
/// 对flash内置的流编码进行解码
/// </summary>
private string flashdata_decode(string s)
{
// PHP原始代码 ///////////////////////////////////////////
//$r = '';
//$l = strlen($s);
//for($i=0; $i<$l; $i=$i+2) {
// $k1 = ord($s[$i]) - 48;
// $k1 -= $k1 > 9 ? 7 : 0;
// $k2 = ord($s[$i+1]) - 48;
// $k2 -= $k2 > 9 ? 7 : 0;
// $r .= chr($k1 << 4 | $k2);
//}
//return $r;
// PHP原始代码 /////////////////////////////////////////// // 改写后的C#代码 //////////////////////////////////////////
string r = "";
int k1, k2;
for (int i = 0; i < s.Length; i = i + 2)
{
k1 = (char)(s[i]) - 48;
k1 -= k1 > 9 ? 7 : 0;
k2 = (char)(s[i + 1]) - 48;
k2 -= k2 > 9 ? 7 : 0;
r += Convert.ToChar(k1 << 4 | k2);
}
return r;
// 改写后的C#代码 ////////////////////////////////////////// }怀疑 2:PHP与C#写文件的机制不同//PHP 原始代码:确实能生成“a1.jpg”,并且可以正常浏览
$bigavatar = $this->flashdata_decode( $_POST['avatar1'] );
$bigavatarfile = 'D:\test\a1.jpg';
$fp = @fopen($bigavatarfile, 'wb');
@fwrite($fp, $bigavatar);
@fclose($fp);//C#改写:试了多种方法,也能生成“a1.jpg”,但却都是无效的图片文件
string bigavatar = flashdata_decode(Request.Form["avatar1"]);
string bigavatarfile = 'D:\test\a1.jpg';//方式1(直接写入字符串):
File.WriteAllText(bigavatarfile, bigavatar);
//方式2(写byte):
FileStream fs = new FileStream(bigavatarfile, FileMode.Create);
Byte[] info = new ASCIIEncoding().GetBytes(bigavatar);
fs.Write(info, 0, info.Length);
fs.Flush();
fs.Close();本人对PHP是一窍不通,完全是对照着PHP手册,按照自己的理解改写的。有什么低级错误的话,见笑。
麻烦大家帮忙看看是什么原因,在此谢过。
/// <summary>
/// 对flash内置的流编码进行解码
/// </summary>
private string flashdata_decode(string s)
{
// PHP原始代码 ///////////////////////////////////////////
//$r = '';
//$l = strlen($s);
//for($i=0; $i<$l; $i=$i+2) {
// $k1 = ord($s[$i]) - 48;
// $k1 -= $k1 > 9 ? 7 : 0;
// $k2 = ord($s[$i+1]) - 48;
// $k2 -= $k2 > 9 ? 7 : 0;
// $r .= chr($k1 << 4 | $k2);
//}
//return $r;
// PHP原始代码 /////////////////////////////////////////// // 改写后的C#代码 //////////////////////////////////////////
string r = "";
int k1, k2;
for (int i = 0; i < s.Length; i = i + 2)
{
k1 = (char)(s[i]) - 48;
k1 -= k1 > 9 ? 7 : 0;
k2 = (char)(s[i + 1]) - 48;
k2 -= k2 > 9 ? 7 : 0;
r += Convert.ToChar(k1 << 4 | k2);
}
return r;
// 改写后的C#代码 ////////////////////////////////////////// }怀疑 2:PHP与C#写文件的机制不同//PHP 原始代码:确实能生成“a1.jpg”,并且可以正常浏览
$bigavatar = $this->flashdata_decode( $_POST['avatar1'] );
$bigavatarfile = 'D:\test\a1.jpg';
$fp = @fopen($bigavatarfile, 'wb');
@fwrite($fp, $bigavatar);
@fclose($fp);//C#改写:试了多种方法,也能生成“a1.jpg”,但却都是无效的图片文件
string bigavatar = flashdata_decode(Request.Form["avatar1"]);
string bigavatarfile = 'D:\test\a1.jpg';//方式1(直接写入字符串):
File.WriteAllText(bigavatarfile, bigavatar);
//方式2(写byte):
FileStream fs = new FileStream(bigavatarfile, FileMode.Create);
Byte[] info = new ASCIIEncoding().GetBytes(bigavatar);
fs.Write(info, 0, info.Length);
fs.Flush();
fs.Close();本人对PHP是一窍不通,完全是对照着PHP手册,按照自己的理解改写的。有什么低级错误的话,见笑。
麻烦大家帮忙看看是什么原因,在此谢过。
主要想知道fopen与fwrite的原理。另外,有能力解决我问题的只有3种人:
1. 精通php,熟悉.net
2. 精通.net,熟悉php
3. 同时精通两者所以不好意思了
那么在 C# 中是不可以用
k1 = (char)(s[i]) - 48;
这样操作的,必须先将 s 转换成字节数组
你的php是发送信息,c#接送吗?
//c#忘记的差不多了http://www.dailycoding.com/Posts/convert_image_to_base64_string_and_base64_string_to_image.aspx
//这文章希望对你有帮助