posts - 8,  comments - 22,  trackbacks - 0
  置顶随笔
摘要: 这个相关的资料比较少,放在首页是希望跟多的牛人讨论下!!地图上A点到B点(A、B两点的经纬度都已知)求一个方向值 (分八种:正东 正南 正西 正北 东南 东北 西北 西南)在sqlserver写一个函数,找位高手请教哈!补充一下! 例如:A点(114 ,31) B点(115 ,45) 求A点到B点时途径的方向(八种状态) 用数据库(sqlserver2000)函数实现 。。。。。。。。。。。。。。...阅读全文
posted @ 2008-08-18 20:00 岁寒づ古枫 阅读(104) 评论(2) 编辑
  2009年2月16日

笔记本电脑+USB接口GPS+WM6模拟器+PPC版城际通

[color=Red][size=7]下面增加了PDF格式的图文教程![/size][/color]
--------------------------------------------
一直对GPS有兴趣,前几天用“笔记本电脑+蓝牙适配器+蓝牙GPS+城际通锐思FOR PC“ 和 ”笔记本电脑+USB接口GPS+城际通锐思FOR PC“,都已成功,但是所用得城际通的版本是“城际通锐思版”是专门为PC电脑制作的,这个版本有个优点就是大屏幕,看着爽,但是有个致使的缺点,那就是 基于PC的地图更新太慢,最新的地图也是2007年以前的,新的高速及道路根本就没有,所以说玩玩可以,但是实际起来应该只是具有一定的参考价值。

基于此,如何使没有PDA,只有笔记本电脑的同志们,也可以使用最新的地图,成了我的研究方向,嘿嘿!经过三天的研究,终于实现了“笔记本电 脑+USB接口GPS+WM6模拟器+PPC版城际通”, 这里所使用的城际通是最新版的,是PPC版的,地图是2008年7月份的地图,应该是最新的 了,并且以后还可以升级,这下有笔记本的朋友更可以爽一下了,唯一的一个小小的缺点就是地图界面有点小,不过这根本就不影响使用。

闲话不说,各位看官来看看看安装过程吧!

-------------------------

在安装之前需要准备的一些硬件和软件程序(相关的软件程序全部都是在网上搜索下载得到的,请自行搜索并下载备用)。

[size=5][color=red]所需硬件:[/color][/size]

1、笔记本电脑一台(至少有一个USB接口);

2、USB接口GPS一个(淘宝2008年12月的二手韩国货价格约为70元,不含运费);


[size=5][color=red]所需软件:[/color][/size]

PC上用的
---------

1、USB接口GPS的驱动程序
(说明:一般在购买时卖家都会给你的,我的驱动程序的名子是“PL-2303 driver”)

2、Microsoft .NET Framework 2.0.exe
(说明:Microsoft .NET Framework 2.0版包括了您运行使用.NET Framework开发的应用程序时所需的所有内容.NET Framework 2.0版提供了改进的缓存、使用ClickOnce改进了应用程序部署和更新、通过 ASP.NET 2.0控件和服务对最广泛的浏览器和设备提供更强大的支持,从而提高了可扩展性和性能。)

3、Microsoft Device Emulator3.0.exe中文版
(说明:Microsoft Device Emulator 3.0 是一个windows mobile 系统开发的模拟器.适用于 ARM 架构装置之第三版公开发行的装置仿真器。这个仿真器也将与 Visual Studio 2008 一起发行。 Device Emulator 3.0 将取代先前版本 (1.0 和 2.0) 中的可执行档和 DLL。Device Emulator 3.0 主要的新增功能是装置仿真器管理员的全新自动化 API。这可以让开发人员具备程序存取权限,能够在安装的仿真器镜像上执行与在 [装置仿真器管理员] 下拉式清单和内容菜单中相同的作业。)

4、Windows Mobile 6 Professional Images (CHS).msi
(说明:这个是在电脑中模拟出WM6界面及功能的主文件。)

5、WindowsCE Device Emulator Launcher.exe
(说明:上面第三个程序Microsoft Device Emulator 是可以在 Windows 中 模拟运行 Windows CE/ Windows Mobile系统的模拟器,有许多自定义选项,需要使用命令行启动。为了更方便的启动它,wbpluto 用 C# 编写了这个启动设置程序WindowsCE Device Emulator Launcher.exe ,这是wbpluto 发布的第一个原创应用程序。无需使用命令行参数,只需鼠标点选几下就可按需启动Microsoft Device Emulator 3.0/2.0 。

6、GPS_Viewer.exe
(说明:这个程序有PC版的,有PPC版的,这里需要的是一个PC版的,用来测试当USB接口GPS接好后,是否可正常读到GPS信号。)


PPC上用的(就是模拟PDA上用的)
----------

1、城际通3550-3506地图文件及主程序**文件。

2、GpsGate V2.6.0 中文版
(说明:GpsGate是一个可以对设备的GPS端口及信号进行管理的小程序,利用它,我们可以将一个物理的GPS端口虚拟成多个端口,供几个不同的 GPS程序同时使用。最新的2.5版本新增了GPS坐标上传、下载的功能,利用这个功能,我们可以很轻易的就实现以前只有在电影里才能看到的实时跟踪定 位。 )


[size=5][color=red]准备好以上有硬件和软件后,下面开始安装:[/color][/size]
===================================

1、先装USB接口GPS插入笔记本电脑,根据提示安装相应的USB接口的GPS驱动;(这里需要注意一点,你每次接USB接口时最好使用同一个USB接口,这样你再下次接入时就不会提示让你再安装驱动了,并且所模拟的COM端口也是基本固定不变的)。

2、安装好了,在“设备管理器”中“端口(COM和LPT)”项中可以看到有一个新增加的端口,名子是“Prolific USB-to-Serial Comm Port (COM3)”,我的电脑是增加了一个“COM3”端口(注意:不同的电脑这个参数可能会改变)。可在电脑上安装一下“GPS_Viewer.exe”, 测试相应端口是否可读到GPS信号。

3、如果端口读取GPS信号正常,下面就开始安装WM6的PC模拟器。

4、首先要安装Microsoft .NET Framework 2.0,如果已经有了,再装一次也无妨。

5、再安装“Microsoft Device Emulator3.0(PPC模拟器)中文版”;

6、再安装“Windows Mobile 6 Professional Images (CHS).msi”中文WM6的模拟文件;

7、然后就可以运行“WindowsCEDeviceEmulatorLauncher.exe”这个模拟器的主程序了;

8、主程序运行后,就可以点击“启动仿真器”来启动WM6的仿真界面了。

9、进入WM6的仿真界面后。点击左上角的“文件”-》“配置”-》在“常规”项目下,选择“共享文件夹”,这个共享文件夹就是模拟“SD”卡所在的位置 -》在“外围设备”项目下,在“串行端口0”下面选中上面USB接口GPS所生成的COM3端口-》如果要想有声音再选中下面的“扬声器”-》点确定。

10、然后进入模拟WM6中,安装GPS_Gate2.6中文版,安装完成后。在“程序”中找到这个程序,并运行它。让这个程序自动搜索GPS相应端口, 会自动找到一个“COM1”,对是“COM1”,不要怀疑。然后正常点击,直到完成。这时在模拟器右下角的程序小图标应该是绿色的,表示连接正常。

11、再次进入gpsgate2.6的设置界面,查看“输出端口”,可以看到下面有一个模拟的COM2端口。记住。

12、然后进入城际通(Navi)目录下,修改“cjmap.ini”文件中,COM=2;如有必要,也可对“Loader.ini”这个文件进行修改。

13、修改完成后,再进入WM6的模拟界面。“开始”-》“设置”-》“系统”-》打开”External GPS”-》将GPS程序端口设置为COM1-》将GPS硬件端口设置为COM2,速率4800-》将“访问”中的“自动管理GPS”选中。-》OK退出。

14、这时基本完成,进入SD卡,运行Navi目录下的Loader程序。一切OK,开始导航!

[[i] 本帖最后由 光头家伟 于 2008-12-11 10:04 编辑 [/i]]

光头家伟 发表于 2008-12-6 17:44

补充:我所使用的这个WM6模拟器是微软标准的模拟器,非常稳定,网上有一些“Windows Mobile 6 模拟器绿色版”,45M大小左右,也可以用,但是不太稳定(例如在运行城际通横屏时,有时会自动变成竖屏,无法正常使用),特在此说明!

放任的血 发表于 2008-12-7 12:43

:D :D :D 非常不错

scoccer 发表于 2008-12-7 18:15

楼主蛮详细的,赞一个!!!:victory:

helloyou 发表于 2008-12-7 22:28

:victory: :victory:

henry.zheng 发表于 2008-12-7 23:47

有点“画蛇添足”,能买得起笔记本电脑,买不起一个GPS?最便宜的几百元搞掂,还用得着搞得那么麻烦吗?况且车上如何放个笔记本电脑啊?:'(

光头家伟 发表于 2008-12-8 09:15

[quote]原帖由 [i]henry.zheng[/i] 于 2008-12-7 23:47 发表 [url=http://bbs.hz-pda.com/redirect.php?goto=findpost&pid=99029&ptid=11489][/url]
有点“画蛇添足”,能买得起笔记本电脑,买不起一个GPS?最便宜的几百元搞掂,还用得着搞得那么麻烦吗?况且车上如何放个笔记本电脑啊?:'( [/quote]
============
嘿嘿!我也觉得”画蛇添足“!
只是喜欢研究这个东西,所以看别人能搞定,我就试了,说句不好听的,我研究了三天才搞好的!
=======
另:我最早用得是一个NAVMAN的蓝牙GPS,还不错,就是感觉有点费电。后来弄了一个NCS-NAVI R150+,这个好得很,可以直接有记录轨迹的功能,有空给兄弟们上个图看看。最近看到有个韩国的USB接口的GPS也不错,所以也淘来研究研究。

ymlgy 发表于 2008-12-23 12:11

看来我要看看

jmiphg 发表于 2008-12-25 09:46

谢谢 啊 LZ 辛苦了 {:3_51:}

唐online 发表于 2009-2-12 13:03

[b] [url=http://bbs.hz-pda.com/redirect.php?goto=findpost&pid=98802&ptid=11489]1#[/url] [i]光头家伟[/i] [/b]


dingdingding
posted @ 2009-02-16 13:47 岁寒づ古枫 阅读(3520) 评论(1) 编辑
  2009年2月13日

调试Web程序的时候,突然页面不能显示出来,老是显示着“网页无法显示”的页面。云里雾里,鬼知道是怎么解决的,终于一个惊天大发现:IE地址栏里面 显示端口号和桌面任务栏右下角“ASP.NET Development Server”的端口压根就不一致,我把IE地址栏的端口号改成“ASP.NET Development Server”显示的端口号,结果网页就出来了,后面在Google上继续搜索,查询关键字“VS2005  调试 端口不一致”,终于找到了答案,原来是防火墙的缘故,我把高人的原话引用过来:

引用

“是否安装了NOD32 3.0以上版本?或者还有其它什么防火墙类软件?
如果你是安装NOD32 3.0的,按照以下方法做:
依次进入NOD32的高级设置(F5),Web访问保护,HTTP,Web浏览器,会看到一个程序列表你的devenv.exe应该在其中,双击 前面的勾(相当于去掉选中状态),确定退出,停止一切运行的ASP.NET Development Server,在VS中打开并重新编译运行你的Web程序”

:其实出现端口号不一致的问题,如果想要web程序跑起来还是没有问题 的,那就是不采用随机端口的方式,在VS2005里面的“网站”-->“启动选项”-->“启动选项”,找到“服务器”,然后选中“使用自定 义服务器”,在“基URL”中填上web程序的虚拟路径即可,一般就是::http://机器名(或你本机的IP地址)/web程序别名
posted @ 2009-02-13 11:14 岁寒づ古枫 阅读(923) 评论(5) 编辑
  2008年11月26日
filter[0][data][comparison] lt

filter[0][data][type] numeric

filter[0][data][value] 4

filter[0][field] id

filter[1][data][comparison] gt

filter[1][data][type] numeric

filter[1][data][value] 20

filter[1][field] price

 

 

C#.net中什么类型能存放这种数组!

posted @ 2008-11-26 17:10 岁寒づ古枫 阅读(136) 评论(0) 编辑
  2008年8月18日

这个相关的资料比较少,放在首页是希望跟多的牛人讨论下!!

 

地图上A点到B点(A、B两点的经纬度都已知)
求一个方向值 (分八种:正东 正南 正西 正北 东南 东北 西北 西南)
在sqlserver写一个函数,找位高手请教哈!

 

 

补充一下!
例如:A点(114 ,31)   B点(115 ,45)
求A点到B点时途径的方向(八种状态)   用数据库(sqlserver2000)函数实现
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
本人刚接触GIS不深,请教高人指点!

posted @ 2008-08-18 20:00 岁寒づ古枫 阅读(104) 评论(2) 编辑
几种常见的浏览器内核简介:

Trident:Windows 下的 IE 浏览器使用的内核代号。除 IE 外,众多的 IE Shell(如 Maxthon )都使用这个内核。

Gecko:Mozilla Firefox 浏览器使用的内核代号。使用 Gecko 内核的浏览器也有不少,如 Netscape 、MozillaSuite/SeaMonkey 等。另外,Mozilla Thunderbird 也使用 Gecko 。

Presto:Opera 浏览器使用的内核代号,这是目前公认网页浏览速度最快的浏览器内核。

KHTML/WebCore:Konqueror/Safari 浏览器使用的内核代号。Konqueror 是 X 协议下的 KDE 桌面环境使用的浏览器和资源管理器,可以用在 Unix/Linux/BSD 系统中,据说 KDE 4.0 以后会有向 Windows 移植的计划;Safari 则是 Apple 用户中最受欢迎的浏览器。

现在很多浏览器都是采用了这些内核。
posted @ 2008-08-18 14:13 岁寒づ古枫 阅读(1169) 评论(1) 编辑
  2008年8月16日

一、理解Html DOM、Ext Element及Component
要学习及应用好Ext框架,需要理解Html DOM、Ext Element及Component三者的区别。
Ext是基于Web的富客户端框架,其完全是基于标准W3C技术构建设的,使用到的都是HTML、CSS、DIV等相关技术。Ext最杰出之处,是开发了一系列非常简单易用的控件及组件,我们只需要使用这些组件就能实现各种丰富多彩的UI的开发。
无论组件有多少配置属性、还是事件、方法等等,其最终都会转化为HTML在浏览器上显示出来,而每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM对象,动态改变页面的内容,正是通过使用脚本语言来操作DOM对象实现。
仅仅有DOM是不够的,比如要把页面中的某一个节点移到其它位置,要给某一个节点添加阴影效果,要隐藏或显示某一个节点等,我们都需要通过几句javascript才能完成。因此,Ext在DOM的基础上,创建了Ext Element,可以使用Element来包装任何DOM,Element对象中添加了一系列快捷、简便的实用方法。
对于终端用户来说,仅仅有Element是不够的,比如用户要显示一个表格、要显示一棵树、要显示一个弹出窗口等。因此,除了Element以外,Ext还建立了一系列的客户端界面组件Component,我们在编程时,只要使用这些组件Componet即可实现相关数据展示及交互等,而Component是较高层次的抽象,每一个组件在渲染render的时候,都会依次通过Element、DOM来生成最终的页面效果。
在使用Ext开发的应用程序中,组件Component是最高层次的抽象,是直接给用户使用的,Ext Element是Ext的底层API,主要是由Ext或自定义组件调用的,而DOM是W3C标准定义的原始API,Ext的Element通过操作DOM来实现页面的效果显示。
在Ext中,组件渲染以后可以通过访问组件的el属性来得到组件对应的Element,通过访问Element的dom属性可以得到其下面的DOM对象。另外,我们可以通过通过Ext类的快捷方法getCmp、get、getDom等方法来得组件Component、Ext元素Element及DOM节点。比如:
    var view=new Ext.Viewport();//创建了一个组件Component
view.el.setOpacity(.5);//调用Element的setOpacity方法
view.el.dom.innerHTML="Hello Ext";//通过Element的dom属性操作DOM对象

再看下面的代码:
var win=new Ext.Window({id:"win1",title:"我的窗口",width:200,height:200});
win.show();
var c=Ext.getCmp("win1");//得到组件win
var e=Ext.get("win1");//根据id得到组件win相应的Element
var dom=Ext.getDom("win1");//得到id为win1的DOM节点

二、熟悉ext组件体系
Ext2.0对整个框架进行了重构,最为杰出的是推出了一个以Component类为基础的组件体系,在Component类基础上,使用面向对象的方法,设计了一系列的组件及控件。因此,要能游刃有余地使用Ext,熟悉Ext组件体系是最基本的。
在《ExtJS实用开发指南》中,有如下面一幅组件图:
 
通过组件结构图我们可以一目了然的看出整个Ext组件继承及组成体系,当使用一个组件的时间,了解他的继承体系,这样可以便于我们掌握组件的各种特性。


三、掌握核心控件 
控件其实也是组件,比如用于显示树信息的TreePanel、用于显示表格的GridPanel及EditorGridPanel,还有代表应用程序窗口的Ext.Window等都属于Ext控件。在使用Ext的时候,一定要掌握一些核心控件,特别是处于基类的控件。比如上面提到的几个控件,他们都是继承于面板Panel,所以我们要重点掌握面板这个核心控件的特性。比如面板由以下几个部分组成:一个顶部工具栏(tbar)、一个底部工具栏(bbar)、面板头部(header)、面板尾部(bottom)、面板主区域(body)几个部分组成。面板类中还内置了面板展开、关闭等功能,并提供一系列可重用的工具按钮使得我们可以轻松实现自定义的行为,面板可以放入其它任何容器中,面板本身是一个容器,他里面又可以包含各种其它组件。只要掌握了Panel的应用,那么学习TreePanel、Window等就会变得简单得多。
同样的道理,对于Ext的表单字段来说,不管是ComboBox,NumberField、还是DateField,他们其它都是Ext.form.Field类的子类,在他上面定义了表单字段的各种基本操作及特性。在学习使用表单字段组件时,一定要重点研究Field这个类,掌握他的主要方法、事件等,就能有助于更好的学习使用其它的字段。

四、学习及研究示例
由于javascript语言非常灵活,不像静态强类型语言(比如Java)那样有固定的代码设计模式,而往往是不同的人就有不同的编程风格。在实际应用开发中,只有见多识广,才能在自己的在脑中建立一个开发库。
学习别人的示例对于我们开发帮助会非常大,示例包括基本组件的应用、综合应用等多个方面。在此,简单推荐几个。
1、Ext官方示例,在ext项目下载包的examples目录中,包括各个控件的基本应用演示,同时还有一些比较复杂的组合示例,有简有繁,非常适合初学者认真研究。
2、Vifir推出的示例,Vifir推出的一些示例主要包括两类,一种是开源的示例应用,另外一种是针对VIP用户的实用示例。开源的示例主要是指wlr单用户blog系统,这个一个集合了前后台技术的ext综合示例,而针对VIP用户的实用示例则是可以作为开发骨架或扩展组件的示例。
3、其它示例,在ext社区中还有很多比较优秀的ext应用示例,有些只是一个应用演示,虽然没有提供源码下载,但我们可以直接下载引用的js文件来得到这些示例的ext应用代码,同样能取起到非常好的学习效果。

五、多运用
Ext看起来是非常简单的东西,稍有点编程知识的人,按照《ExtJS实用开发指南》中的入门指南,半小时就能学会使用Ext。然而,当准备使用Ext开发一个项目时,却不知道从何处入手,或者是在使用Ext的时候,出了一点小问题自己不知道该如何解决。编程是一门实践性的科学,仅仅靠看书、看别人写的代码是远远不够的,因此,必须多做实践才行,只有通过不断的练习,大量的使用,才能对Ext的组件特性、事件、事件处理机制以及与服务器端交互接口等深入的掌握,只有多做运用,深入了解ext的组件的工作原理及机制,才能编写出高级的Ext的应用。


六、熟读Ext项目的源代码
    如果要想深入应用Ext,那么阅读Ext项目的源代码这是必不可少的环节,Ext的代码质量非常高,通过阅读他的代码我们可以更加深刻的了解javascript面向对象编程,Ext代码中包含了很多高级的js技巧以及设计模式。在使用Ext的过程中,我们经常根据项目的需要对Ext组件进行扩展,设计自己的组件或控件,而如何实现一个自定义的Ext组件,我们可以从Ext的各个组件源代码中找到答案。
    Ext的源代码在Ext项目的source目录。读Ext源码,并不一定非要从某一个地方开始,而组件核心代码Component.js、容器组件代码Container.js、面板Panel.js等这些是必看的; core目录中的Element.js、Ext.js等也是必看的。当需要从一个控件进行扩展的时候,最好能简单看一看这个控件的源代码。

posted @ 2008-08-16 17:48 岁寒づ古枫 阅读(293) 评论(0) 编辑

PHP版破解QQ聊天纪

namespace
Van.Utility.QQMsg
{
    public enum QQMsgType
    {
        BIM, C2C, Group, Sys, Mobile, TempSession //Disc
    }

    class QQMsgMgr
    {
        private static readonly int s_MsgTypeNum = (int)QQMsgType.TempSession + 1;
        private static readonly string[] s_MsgName = new string[] {
            "BIMMsg", "C2CMsg", "GroupMsg", "SysMsg", "MobileMsg", "TempSessionMsg"
        };
        private IStorageWrapper m_Storage;
        private byte[] m_Password;

        private List<string>[] m_MsgList = new List<string>[s_MsgTypeNum];

        public void Open(string QQID)
        {
            Open(QQID, null);
        }
        public void Open(string QQID, string QQPath)
        {
            if (QQPath == null)
            {
                using (Microsoft.Win32.RegistryKey reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"Software\Tencent\QQ"))
                {
                    QQPath = reg.GetValue("Install") as string;
                }
                if (QQPath == null) return;
            }

            for (int i = 0; i < m_MsgList.Length; ++i)
            {
                m_MsgList = new List<string>();
            }
            m_Storage = null;
            m_Password = null;

            m_Storage = new IStorageWrapper(QQPath + QQID + @"\MsgEx.db");
            m_Password = QQMsgMgr.GetGlobalPass(m_Storage);

            if (m_Password == null) m_Storage = null;

            foreach (IBaseStorageWrapper.FileObjects.FileObject fileObject in m_Storage.foCollection)
            {
                if (fileObject.FileType == 1)
                {
                    for (int i = 0; i < m_MsgList.Length; ++i)
                    {
                        if (fileObject.FilePath == s_MsgName)
                        {
                            m_MsgList.Add(fileObject.FileName);
                        }
                    }
                }
            }
        }

        public void OutputMsg()
        {
            for (int i = 0; i < s_MsgTypeNum; ++i)
            {
                OutputMsg((QQMsgType)i);
            }
        }
        public void OutputMsg(QQMsgType type)
        {
            if (m_Storage == null) return;
            if (m_Password == null) return;

            int typeIndex = (int)type;
            if (typeIndex < 0 || typeIndex >= s_MsgTypeNum)
            {
                throw new ArgumentException("Invalid QQMsgType", "type");
            }

            string filePath = s_MsgName[typeIndex] + "\\";
            Directory.CreateDirectory(filePath);

            foreach (string QQID in m_MsgList[typeIndex])
            {
                string fileName = filePath + QQID + ".msj";
                OutputMsg(type, QQID, fileName);
            }
        }
        public void OutputMsg(QQMsgType type, string QQID)
        {
            if (m_Storage == null) return;
            if (m_Password == null) return;

            int typeIndex = (int)type;
            if (typeIndex < 0 || typeIndex >= s_MsgTypeNum)
            {
                throw new ArgumentException("Invalid QQMsgType", "type");
            }

            string filePath = s_MsgName[typeIndex] + "\\";
            Directory.CreateDirectory(filePath);

            string fileName = filePath + QQID + ".msj";
            OutputMsg(type, QQID, fileName);
        }

        private void OutputMsg(QQMsgType type, string QQID, string fileName)
        {
            string msgPath = s_MsgName[(int)type] + QQID;
            IList<byte[]> msgList = QQMsgMgr.DecryptMsg(m_Storage, msgPath, m_Password);
            Encoding encoding = Encoding.GetEncoding(936);

            using (FileStream fs = new FileStream(fileName, FileMode.Create))
            {
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    for (int i = 0; i < msgList.Count; ++i)
                    {
                        using (MemoryStream ms = new MemoryStream(msgList))
                        {
                            using (BinaryReader br = new BinaryReader(ms, Encoding.GetEncoding(936)))
                            {
#if false
                                fs.Write(msgList, 0, msgList.Length);
#else
                                int ticks = br.ReadInt32();
                                DateTime time = new DateTime(1970, 1, 1) + new TimeSpan(0, 0, ticks);
                                switch (type)
                                {
                                    case QQMsgType.BIM:
                                    case QQMsgType.C2C:
                                    case QQMsgType.Mobile:
                                        ms.Seek(1, SeekOrigin.Current);
                                        break;
                                    case QQMsgType.Group:
                                        ms.Seek(8, SeekOrigin.Current);
                                        break;
                                    case QQMsgType.Sys:
                                        ms.Seek(4, SeekOrigin.Current);
                                        break;
                                    case QQMsgType.TempSession: //?
                                        ms.Seek(9, SeekOrigin.Current);
                                        break;
                                }
                                if (type == QQMsgType.TempSession)
                                {
                                    int gLen = br.ReadInt32();
                                    string groupName = encoding.GetString(br.ReadBytes(gLen));
                                    if (groupName.Length > 0) sw.WriteLine("{0}", groupName);
                                }
                                int nLen = br.ReadInt32();
                                string id = encoding.GetString(br.ReadBytes(nLen));
                                sw.WriteLine("{0}: {1}", id, time.ToString());
                                int cLen = br.ReadInt32();
                                string msg = encoding.GetString(br.ReadBytes(cLen));
                                msg.Replace("\n", Environment.NewLine);
                                sw.WriteLine(msg);
                                sw.WriteLine();
#endif
                            }
                        }
                    }
                }
            }
        }

        public void OutputFileList()
        {
            if (m_Storage == null) return;

            Dictionary<string, long> dic = new Dictionary<string, long>();
            foreach (IBaseStorageWrapper.FileObjects.FileObject fileObject in m_Storage.foCollection)
            {
                if (fileObject.FileType == 2 && fileObject.FileName == "Index.msj")
                {
                    dic[fileObject.FilePath] = fileObject.Length / 4;
                }
            }

            for (int i = 0; i < m_MsgList.Length; ++i)
            {
                Console.WriteLine("{0}", s_MsgName);
                foreach (string ID in m_MsgList)
                {
                    Console.WriteLine("\t{0}: {1}", ID, dic[s_MsgName + ID]);
                }
            }
        }

        private static IBaseStorageWrapper.FileObjects.FileObject GetStorageFileObject(IStorageWrapper iw, string path, string fileName)
        {
            foreach (IBaseStorageWrapper.FileObjects.FileObject fileObject in iw.foCollection)
            {
                if (fileObject.CanRead)
                {
                    if (fileObject.FilePath == path && fileObject.FileName == fileName) return fileObject;
                }
            }
            return null;
        }
        private static byte[] Decrypt(byte[] src, byte[] pass, long offset)
        {
            RedQ.QQCrypt decryptor = new RedQ.QQCrypt();
            return decryptor.QQ_Decrypt(src, pass, offset);
        }

        private static IList<byte[]> DecryptMsg(IStorageWrapper iw, string path, byte[] pass)
        {
            List<byte[]> msgList = new List<byte[]>();

            int num = 0;
            int[] pos = null;
            int[] len = null;
            using (IBaseStorageWrapper.FileObjects.FileObject fileObject = GetStorageFileObject(iw, path, "Index.msj"))
            {
                if (fileObject == null) return msgList;
                int fileLen = (int)fileObject.Length;
                num = fileLen / 4;
                pos = new int[num + 1];
                using (BinaryReader br = new BinaryReader(fileObject))
                {
                    for (int i = 0; i < num; ++i)
                    {
                        pos = br.ReadInt32();
                    }
                }
            }
            using (IBaseStorageWrapper.FileObjects.FileObject fileObject = GetStorageFileObject(iw, path, "Data.msj"))
            {
                if (fileObject != null)
                {
                    int fileLen = (int)fileObject.Length;
                    len = new int[num];
                    pos[num] = fileLen;
                    for (int i = 0; i < num; ++i)
                    {
                        len = pos[i + 1] - pos;
                    }
                    using (BinaryReader br = new BinaryReader(fileObject))
                    {
                        for (int i = 0; i < num; ++i)
                        {
                            fileObject.Seek(pos, SeekOrigin.Begin);
                            byte[] data = br.ReadBytes(len);
                            byte[] msg = Decrypt(data, pass, 0);
                            msgList.Add(msg);
                        }
                    }
                }
            }
            return msgList;
        }
        private static byte[] GetGlobalPass(IStorageWrapper iw)
        {
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            string QQID = "254614441";
            byte[] dataID = new byte[QQID.Length];
            for (int i = 0; i < QQID.Length; ++i) dataID = (byte)(QQID);
            byte[] hashID = md5.ComputeHash(dataID);
            IBaseStorageWrapper.FileObjects.FileObject fileObject = GetStorageFileObject(iw, "Matrix", "Matrix.db");
            if (fileObject != null)
            {
                using (BinaryReader br = new BinaryReader(fileObject))
                {
                    byte[] data = br.ReadBytes((int)fileObject.Length);
                    long len = data.Length;
                    if (len < 6 || data[0] != 0x51 || data[1] != 0x44) return null;
                    if (len >= 32768) return null;

                    bool bl = false;
                    int i = 6;
                    while (i < len)
                    {
                        bl = false;
                        byte type = data[i++];
                        if (i + 2 > len) break;
                        int len1 = data + data[i + 1] * 256;
                        byte xor1 = (byte)(data ^ data[i + 1]);
                        i += 2;
                        if (i + len1 > len) break;
                        for (int j = 0; j < len1; ++j) data[i + j] = (byte)(~(data[i + j] ^ xor1));
                        if (len1 == 3 && data == 0x43 && data[i + 1] == 0x52 && data[i + 2] == 0x4B)
                        {
                            bl = true;
                        }
                        i += len1;

                        if (type > 7) break;
                        if (i + 4 > len) break;
                        int len2 = data + data[i + 1] * 256 + data[i + 2] * 256 * 256 + data[i + 3] * 256 * 256 * 256;
                        byte xor2 = (byte)(data ^ data[i + 1]);
                        i += 4;
                        if (i + len2 > len) break;
                        if (type == 6 || type == 7)
                        {
                            for (int j = 0; j < len2; ++j) data[i + j] = (byte)(~(data[i + j] ^ xor2));
                        }
                        if (bl && len2 == 0x20)
                        {
                            byte[] dataT = new byte[len2];
                            for (int j = 0; j < len2; ++j) dataT[j] = data[i + j];
                            return Decrypt(dataT, hashID, 0);
                        }
                        i += len2;
                    }
                    if (i != len) return null;
                }
            }
            return null;
        }
    }
}

posted @ 2008-08-16 17:33 岁寒づ古枫 阅读(2656) 评论(12) 编辑
  2008年8月11日
摘要: ext2.0小节1.modal:true这个放在Ext.window里作用是让window成为一个模式窗口,这样当这个窗口弹出后,他的父窗口不可用. 2.当一个Ext.window的closeAction有两种选择close/hide(完全关闭/隐藏)close就是把此window destroy。 hide是把此window隐藏,这样做的复用性比较强,注:如果要重新渲染这个window的html...阅读全文
posted @ 2008-08-11 15:33 岁寒づ古枫 阅读(679) 评论(1) 编辑