孢子,一种另类的WP7第三方数据交换方式(续)
接上文:抛砖引玉,孢子,一种另类的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下载:https://files.cnblogs.com/zjfeiye/MoHooSporeDemo.zip