接上文:抛砖引玉,孢子,一种另类的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