C#与PHP写二进制文件的区别

sky_whale 2010-12-08 11:26:05
问题描述:最近想把一段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手册,按照自己的理解改写的。有什么低级错误的话,见笑。
麻烦大家帮忙看看是什么原因,在此谢过。
...全文
236 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
在-云端 2010-12-08
  • 打赏
  • 举报
回复
.net打酱油的飘过!
沪php攻城师 2010-12-08
  • 打赏
  • 举报
回复
很明显只要精通.net的就可以解决你这个问题了
sky_whale 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jzh2004 的回复:]
C#出错的话,你应该发到C#区去问啊,PHP没有错的话,你还想了解什么呢
[/Quote]

主要想知道fopen与fwrite的原理。

另外,有能力解决我问题的只有3种人:
1. 精通php,熟悉.net
2. 精通.net,熟悉php
3. 同时精通两者

所以。。。不好意思了。。。
沪php攻城师 2010-12-08
  • 打赏
  • 举报
回复
C#出错的话,你应该发到C#区去问啊,PHP没有错的话,你还想了解什么呢
ihefe 2010-12-08
  • 打赏
  • 举报
回复

//c#忘记的差不多了

http://www.dailycoding.com/Posts/convert_image_to_base64_string_and_base64_string_to_image.aspx
//这文章希望对你有帮助

ihefe 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sky_whale 的回复:]

引用 8 楼 ihefe 的回复:
数据流编码成base64传输方便些


能否说具体一些?谢谢~~
[/Quote]

你的php是发送信息,c#接送吗?
sky_whale 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ihefe 的回复:]
数据流编码成base64传输方便些
[/Quote]

能否说具体一些?谢谢~~
看看山观观海 2010-12-08
  • 打赏
  • 举报
回复
c和php、、如果交互改的话应该很难的吧、、
ihefe 2010-12-08
  • 打赏
  • 举报
回复
编码后的数据流,接收后解码,可以直接写入文件
ihefe 2010-12-08
  • 打赏
  • 举报
回复
数据流编码成base64传输方便些
chenlvmei 2010-12-08
  • 打赏
  • 举报
回复
呵呵呵,过来看看有没有好的解决方法的。
fxs_2008 2010-12-08
  • 打赏
  • 举报
回复
不会.net

PHP处理这种没有任何问题:一是直接读串;保险的你还是二进制打开,另写即可


xuzuning 2010-12-08
  • 打赏
  • 举报
回复
如果 s 是 string 类型
那么在 C# 中是不可以用
k1 = (char)(s[i]) - 48;
这样操作的,必须先将 s 转换成字节数组

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧