孢子,一种另类的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

posted @ 2011-07-18 15:33  阿干@NET  阅读(3017)  评论(9编辑  收藏  举报