孢子,一种另类的WP7第三方应用数据交换方式

《孢子》这个游戏玩过的人应该对里面的模型很有印象,尤其会对里面只靠一张PNG就能在游戏中还原成3D很感兴趣,今天要介绍的就是这种技术:在PNG里隐藏我们需要的数据,利用Zune同步到WP7,然后使用MediaLibrary或者PhotoChooserTask读取后经过解析获取隐藏的数据,从而达到想WP7导入任何数据的目的!

因为其来源于孢子,所以我也将其命名为“孢子”!

首先,有兴趣的朋友先可以看看PNG格式规范,这里有一排你文章详细讲解了PNG数据格式:[url]http://wenku.baidu.com/view/c495bf4569eae009581bec99.html[/url]

我们要做的,就是向PNG写入一个自定义数据块!

先来看看我定义的数据存储格式:

这是目前我定义一套数据存储规范,如有不当或更好的方案我们一起来完善

写入数据的核心代码如下:

public void Write(string[] filenames){this.start = this.SourceStream.Length - IEND.Length;// 提取结束标记this.SourceStream.Position = this.start;this.SourceStream.Read(this.IEND, 0, this.IEND.Length);this.SourceStream.Position = this.start;// 生成数据块标记Array.Copy(Encoding.ASCII.GetBytes("IMHD"), 0, this.IMHD, 8, 4);// 写入数据块起始标记this.SourceStream.Write(this.IMHD, 0, this.IMHD.Length);this.length += this.IMHD.Length;// 写入数据内容//byte[] h2 = Encoding.Unicode.GetBytes(BOUNDARY_HEADER);//this.SourceStream.Write(h2, 0, h2.Length);//this.length += h2.Length;foreach (var file in filenames){if (File.Exists(file)){var b1 = Encoding.Unicode.GetBytes(Path.GetFileName(file));var b2 = BitConverter.GetBytes(b1.Length);// 写入文件名长度this.SourceStream.Write(b2, 0, b2.Length);this.length += b2.Length;// 写入文件名this.SourceStream.Write(b1, 0, b1.Length);this.length += b1.Length;using (var fs = new FileStream(file, FileMode.Open)){var b3 = BitConverter.GetBytes(fs.Length);// 写入文件长度this.SourceStream.Write(b3, 0, b3.Length);this.length += b3.Length;// 写入文件内容var buffer = new byte[8192];var count = 0;while (fs.Position < fs.Length){count = fs.Read(buffer, 0, buffer.Length);this.SourceStream.Write(buffer, 0, count);}this.length += fs.Length;var b4 = BitConverter.GetBytes(CRC.CRC32(fs));// 写入CRC校验this.SourceStream.Write(b4, 0, b4.Length);this.length += b4.Length;}}}// 写入数据总长度var lenBytes = BitConverter.GetBytes(this.length - 4);this.SourceStream.Position = this.start;this.SourceStream.Write(lenBytes, 0, lenBytes.Length);Debug.WriteLine("[w]length:" + (this.length - 4));// 写入数据CRCvar crc = CRC.CRC32(this.SourceStream, this.start, this.length);var crcBytes = BitConverter.GetBytes(crc);this.SourceStream.Position = this.start + this.length;this.SourceStream.Write(crcBytes, 0, crcBytes.Length);Debug.WriteLine("[w]crc:" + crc);// 回写结束标记this.SourceStream.Write(this.IEND, 0, this.IEND.Length);

依赖此技术,WP7的数据同步障碍将不复存在,例如,我的书中圣,我可以将一本书打包进PNG,在阅读器里读出来;再比如,将一个rmvb文件打包进PNG,你可以开发个播放器,播放它!其他更多创意尽在你的想象!

本来想做个完整的Demo再放,但是看了下工作计划,貌似如果等完整Demo昨晚不知道猴年马月了,那就先放出来核心代码吧
包括了写入数据读取数据,测试用例是命令行项目,但放到WP7上也很简单,因为操作的都是流,只要你能获取图片流就能搞定,例如MediaLibrary,PhotoChooserTask等

希望这种技术能为大家带来帮助,另外本文提供的源代码,你可以随意修改,使用,但是如果你对其作了改进,希望能反馈给我一份,谢谢

源代码下载:http://files.cnblogs.com/zjfeiye/MoHooSpore.Demo.zip

最后说个事,有人宣称:

1)在图片中隐藏数据是他的专利,其他人要用这种方式必须提到是他发明的

2)在WP7中用PhotoChooserTask读取图片数据流是他的专利,其他人要用这种方式必须提到是他发明的

大家是否觉得可笑?本人在此不做任何评论,但本人也不声明此技术是本人原创,因为这种技术可以说早就被用烂了

转载于:https://www.cnblogs.com/zjfeiye/archive/2011/07/15/2107268.html

抛砖引玉,孢子,一种另类的WP7第三方应用数据交换方式相关推荐

  1. NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息...

    NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息.也许它不能象tcpdump那样提供网络流量的完整记录,但是当汇集起来时,它更加易于管理和易读.Netflo ...

  2. 三种数据交换方式的时延计算

    三种数据交换方式的时延计算 part1:什么是时延?有哪三种数据交换方式? 时延指的是计算机网络性能的一种,表示数据从网络的一端传送到另一端所用的时间. 三种数据交换方式:电路交换.报文交换.分组交换 ...

  3. 下列关于三种数据交换方式的叙述,错误的是( )

    下列关于三种数据交换方式的叙述,错误的是( D ) A. 电路交换不提供差错控制功能 B. 分组交换的分组有最大长度的限制 C. 虚电路是面向连接的,它提供的是一种可靠的服务 D. 在出错率很高的传输 ...

  4. 计算机网络--边缘和核心部分,三种数据交换方式

    目录 互联网的构成和特点 互联网的边缘部分和核心部分 边缘部分 端系统之间的通信方式 客户端-服务器(C/S方式) 对等连接方式(P2P) 核心部分 三种数据交换方式 电路交换 报文交换(存储转发) ...

  5. 计算机网络三种数据交换方式

    三种数据交换方式:电路交换.报文交换.分组交换. 电路交换: 典型应用就是打电话,交换机将两个需要通信的电话申请建立连接(申请占用通道资源)->通话(占用通信资源)->通话后释放连接(释放 ...

  6. 总结 62 种在深度学习中的数据增强方式

    数据增强 数据增强通常是依赖从现有数据生成新的数据样本来人为地增加数据量的过程 这包括对数据进行不同方向的扰动处理 或使用深度学习模型在原始数据的潜在空间(latent space)中生成新数据点从而 ...

  7. 电路交换、报文交换、分组交换三种数据交换方式的特点、优点、应用场景以及技术对比分析

    1.电路交换 电路交换是指在呼叫双方在开始通话之前,首先由交换设备在两者之间建立一条专用电路,并且在整个通话期间独占该条电路直到结束.其通信过程一般分为:电路建立阶段.通信阶段.电路拆除阶段三部分.常 ...

  8. 四种常见的表单提交数据的方式

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  9. 三种数据交换技术的比较

    三种数据交换技术的比较 http://book.51cto.com  2007-04-23 17:55  王达  电子工业出版社  我要评论(1) 摘要:本章主要介绍局域网.广域网,以及OSI各层主要 ...

最新文章

  1. 错误处理: socket.timeout: The read operation timed out
  2. Linux实用命令总结
  3. python gitlab_Python Gitlab Api 使用方法
  4. 【BZOJ3227】红黑树,打表找规律/DP
  5. Profibus-DP智能从站开发过程中若干核心问题的探讨
  6. oracle中job的retry次数,Oracle 19c注意事项: DBMS_JOB 行为变化
  7. spring.xml
  8. 原生ES-Module在浏览器中的尝试
  9. State Street以26亿美元收购资产管理IT供应商Charles River
  10. WINDOWS 98 启动盘(加强版)
  11. 英文站变现赚美金的7种方式
  12. 苹果屏幕镜像_给你们科普一下手机投屏和镜像的区别
  13. 用python刷网页浏览量_用python脚本24小时刷浏览器的访问量方法
  14. 视频 | 计算万物的理论
  15. 计算机开题报告答辩评语,开题报告评语4篇
  16. No rule to make target /opt/ros/kinetic/lib/liborocos-kdl.so.1.3.2问题解决
  17. pytorch对矩阵(奇异和非奇异)求逆
  18. 酒店简易管理系统制作详细过程
  19. MySQL 不等于的三种表示及区别
  20. swagger Could not resolve pointer: /definitions/Person does not exist in document

热门文章

  1. tp-link 怎么打开ssh服务_如何用Xshell远程连接VPS服务器
  2. anaconda 导出和离线安装依赖库(单个或批量)
  3. AI产品--苹果的Face ID
  4. 开机上报树梅派2的IP地址到邮箱
  5. 硬核!用Arduino打造纯机械装置模拟数字时钟
  6. nth_element()
  7. 数据库 实验三 数据库查询和数据操纵
  8. C++设计模式——装饰着模式(高屋建瓴)
  9. 解决 Windows中丢失d3dx9_39.dll
  10. 章泽天加入微软实习 网友:提升程序员整体形象