您的位置:首页 > 其它

孢子,一种另类的WP7第三方数据交换方式(续)

2011-07-18 15:33 267 查看
接上文:抛砖引玉,孢子,一种另类的WP7第三方应用数据交换方式

 

上次放出了一个很粗糙的核心源代码,让各位见笑了,本周末经过自己使用测试后发现,悲剧了。。。

为啥?

因为Zune不支持PNG!我擦他微软,怎么这么落后?咋办?改!

只能使用JPG了,经过一番研究,发现JPG更简单,只需要判断结束标记就行了,JPG的结束标记为0xFFD9。而原先设计的数据格式不需要变动。

这样,JPG的结束标记,同时也成为了附加数据的开始标记,经过改造的搜索标记位的方法如下:

private byte[] EOI = new byte[2] { 0xFF, 0xD9 };
private long GetStartIndex()
{
this.SourceStream.Seek(0, SeekOrigin.Begin);

byte flag1 = this.EOI[0];
byte flag2 = this.EOI[1];
byte[] buffer = new byte[8192];
var readed = this.SourceStream.Read(buffer, 0, buffer.Length);
var idx = 0L;
while (readed != 0)
{
for (var i = 0; i < readed; i++)
{
if (buffer[i] == flag1)
{
if (i + 1 < readed && buffer[i + 1] == flag2)
{
return idx + i + 2;
}
else if (i + 1 == readed)
{
var read = this.SourceStream.ReadByte();
idx++;
if (read == flag2)
{
return this.SourceStream.Position;
}
}
}
}

idx += readed;

readed = this.SourceStream.Read(buffer, 0, buffer.Length);
}

return -1;
}


上一版写的太挫了,效率很低,改造后大大提升性能

同时上一版EmbedFileStream的Read方法也存在问题,这里改进如下:

public override int Read(byte[] buffer, int offset, int count)
{
if (this.position + count > this.length)
{
count = (int)(this.length - this.position);
}
if (count > 0)
{
var readed = this.stream.Read(buffer, offset, count);
position += readed;

return readed;
}
return 0;
}


 

好了,废话不多说了,本次同时提供了WP7项目的例子。

 

源代码&Demo下载:http://files.cnblogs.com/zjfeiye/MoHooSporeDemo.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐