当前位置:  编程技术>移动开发
本页文章导读:
    ▪WTK模拟器之RMS资料(2)        WTK模拟器之RMS文件(2) 从分析可看看出:0x0000 - 0x002f 是文件头00x0030 - 0x00af 是第一记录内容文件头中还有0x001e - 0x001f 意义不明记录内容中还有0x0032 - 0x0033 意义不明(事后发现,这里应该是上一记.........
    ▪ OpenBaseMovil 晋级机制        OpenBaseMovil 升级机制 protected void startApp() throws MIDletStateChangeException { try { // If the last time the application exited it set the install.url // setting, it means that we s.........
    ▪ 开发小弟我的.Net 简单的网络程序       开发我的.Net 简单的网络程序。 需要用到HttpWebResponse的开发,并且读取Stream的数据,贡献下我的源代码。例子虽然很简单,但是很实用。3GEYE|u|IW*^ V$J|plJ)hi3    using System;3GEYEGXn2o1h3WD    .........

[1]WTK模拟器之RMS资料(2)
    来源: 互联网  发布时间: 2014-02-18
WTK模拟器之RMS文件(2)

从分析可看看出:0x0000 - 0x002f 是文件头
00x0030 - 0x00af 是第一记录内容

文件头中还有0x001e - 0x001f 意义不明
记录内容中还有0x0032 - 0x0033 意义不明(事后发现,这里应该是上一记录偏移量)

不过在多次修改记录后,记录的位置会发生变化,甚至有ID不为1的记录出现在0x30,而ID为1的记录出现在其他地方的情况,初步估计是优化的结果。
1 楼 wuhua 2008-03-03  
我觉得大可不必要这样研究
RMS无非就是一个key-value的数据格式
不过这个value是固定的byte key是int而已。所以可以很容易的采用文件的操作模仿一个RMS。
2 楼 iwinyeah 2008-03-04  
嗯,部分同意楼上的观点,不过个人认为RMS与一般的文件式数据库比较,由于它的每个记录的大小是不固定的,因此它的修改操作肯定会做一些额外的(优化)处理.而经过对该文件进行分析,事实也是如此,在记录增大时,它会写到文件底部,而你看到这个情况可能想当然它肯定废弃了原来的空间,而事实上原来的空间是由另一个记录占据了.
我主要是要看它是如何优化它的.
3 楼 iwinyeah 2008-03-04  
而且你看了我第二个分析,我估计它还采用了一个链表方式来加速读取的过程,不分析一下,又如何学习它还有什么好的策略呢?

    
[2] OpenBaseMovil 晋级机制
    来源: 互联网  发布时间: 2014-02-18
OpenBaseMovil 升级机制
   protected void startApp()
            throws MIDletStateChangeException
    {
        try
        {
            // If the last time the application exited it set the install.url
            // setting, it means that we should install a new version of the
            // midlet and exit again
            final String installURL = Settings.getProperty( "install.url" );
            if( installURL != null )
            {
                Settings.setProperty( "install.url", null );
                platformRequest( installURL );
                destroyApp( true );
                notifyDestroyed();
            }
            else
            {
                ((MainController) ViewFactory.getController( "main" ))
                        .startApplication();
            }
        }
        catch( Exception e )
        {
            log.error( e );
            throw new MIDletStateChangeException( e.getMessage() );
        }
    }

从代码可以看出其机制:正常情况下,升级URL是空的,当用户希望升级时,将在RMS中设置升级URL,在应用下次启动时,检测到升级URL不为空就进入了升级流程:
1. 首先清空升级URL值(用户升级后可能保留其RMS数据)
2. 发出平台下载请求(升级URL)
3. 退出应用(应用运行时是不可能升级的)

我的想法:在对于每个应用,在服务器中设置一个文件,里面有应用最新的版本号,当用户发出升级命令时,检查服务器文件的版本号,若比现时的应用高,则进入2,3流程
1 楼 wuhua 2008-03-25  
相对来说,这样比较简单的。j2me升级直接下载个升级包就ok了。

    
[3] 开发小弟我的.Net 简单的网络程序
    来源: 互联网  发布时间: 2014-02-18
开发我的.Net 简单的网络程序。
需要用到HttpWebResponse的开发,并且读取Stream的数据,贡献下我的源代码。例子虽然很简单,但是很实用。3GEYE|u|IW*^ V

$J|plJ)hi3    using System;3GEYEGXn2o1h3WD
    using System.Collections.Generic;
|e)_!B.Y*g3    using System.Text;
vvwnb;DB!W6E*l33GEYEq dcV-K!G M
    using System.Net;
k-U"~ nDrK L A[5^v3    using System.IO;
A#Ji2B@*v3
$ws$I s4E%D6?3    namespace APIDemo3GEYEd!k"|U*Dg)N4I
    {3GEYE&^q�?2s�~
        class Program
j T9S;IP'q0c8bN3        {3GEYE0r G!k0I"jO;@
            static void Main(string[] args)3GEYEEPC%w4Bi,b6k$\*k
            {3GEYED~Rl\qGx I
                Console.WriteLine("Hello C#");3GEYE7~mhc`o}b?
              
5I4b,[@&w j3                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://wap.uc123.com");3GEYE'P8y;m7az;by\av9y
                HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();3GEYE%|g;@^b-C.a
              3GEYEF�DsP"G8i,u1n }6k
                Stream stream = httpWebResponse.GetResponseStream();3GEYEjv8~vH hD/\b#u
                byte[] bytes = new byte[1024];3GEYE9Q.nU A,y
               
Bu8]o)Ay g]uh,J3                int numBytesToRead = (int)bytes.Length;3GEYEn*L+r0p"Aoq
                int numBytesRead = 0;3GEYE0w{$Lt?@:{-y0r$V
                //Console.WriteLine(stream.Length);3GEYE:Y6K.]6[Ue(X

#c:C'}ZJL3                byte[] bs = Read2Buffer(stream,512);
6c,H"I.Z'S?+d&X B33GEYEO.Of[?$IeK5F3L
               
ioQ�h!?s3                   
X,v/f I%l e[2g$sL:yI33GEYES-p�T;n U/D.la:F
                     String text = System.Text.Encoding.UTF8.GetString(bs);3GEYE Q1t)`sr
                    Console.WriteLine(text);
I5u0uoF3               3GEYE]il9U:h4Dc#b!Y
             
XHV*WS+C'YW g3                Console.Read();
/d#z!B�da3               3GEYExN%]#}E`e
               
@-p8P] aZ beF3xt3                //Stream file = httpWebResponse.GetResponseStream();3GEYEp ~(@BJLt0j

[Z E!s5W$}2S*K;c]$N3
\2NO!Pw){x g#h-h'N3            }3GEYE[_uOt
3GEYE'i6I1he"x/S:n
            public static byte[] Read2Buffer(Stream stream, int BufferLen)3GEYE!?/}B;~["q |j7`J
            {3GEYE.O9?2N:jEQk2|
3GEYE9oJQXp)P?l-q
                // 如果指定的无效长度的缓冲区,则指定一个默认的长度作为缓存大小3GEYE,Yp4N+X2d`)FxdO
3GEYE+eLb|JWx%e#j
                if (BufferLen < 1)
b7mx@r4A|r T3                {
3P5A5_1@xvr33GEYE*Bv s�b?
                    BufferLen = 0x8000;
$o1t~D/L0m3
5Dr#c:Y{�GIeO3                }
5DHF/g;y3pm33GEYEza}�a!nn:s}9?Nh
                // 初始化一个缓存区
hx XS)qMnJ5a33GEYE3Y7{_yG
                byte[] buffer = new byte[BufferLen];
jVxo{O3
nU%}moN"O2F3                int read = 0;
9\\_mW$?/p/I33GEYE1Q,wgV*k}!AE9c
                int block;3GEYE!m&oU3B%JjY

CoA6hl$x[A3                // 每次从流中读取缓存大小的数据,知道读取完所有的流为止
"\0m3HThJ33GEYE'ehD"k;nmSYL.a
                while ((block = stream.Read(buffer, read, buffer.Length - read)) > 0)3GEYE+wW.QXO
                {3GEYE~8Y ?p L

s5@P Z,C%p1DF,`3                    // 重新设定读取位置3GEYE8ZbT ~4rp"~

*LO)X8X`X\moq3                    read += block;
*S(bc:H�Dg3
|fWB:p4Xi w.H.b33GEYEtt,p)K`R5z6Z

j_h8zb�Yq3                    // 检查是否到达了缓存的边界,检查是否还有可以读取的信息
^2m]:F#m0W'gi']:i'yY3
\,R*xiBk$P3                    if (read == buffer.Length)3GEYE?#gv{+c8q-N
                    {
2H�yN;G'u\33GEYEk!Am/Dl:a0r:P4c I
                        // 尝试读取一个字节
ecE:whv�aK/u2s33GEYE,v5z1j!jot
                        int nextByte = stream.ReadByte();
?&\Lw/B7W!W7m-J3
,z f]'fO#_3
\#Qivv u9P4kP3
!m`!W0T|7sU2jI3                        // 读取失败则说明读取完成可以返回结果
H'^5_B UuS33GEYEP$d\{md�@(A
                        if (nextByte == -1)
@}n&eQ"evO3                        {
GU7E%Q&BB3
]6n4?;|#{-l3                            return buffer;3GEYE Gi W!~X1zv6xD-k

A~ DCO\8qA:T3                        }3GEYE?&CZ^%~vPI @I
3GEYE y `ph%bN/dBS6r
3GEYEhJA~+nH

8oa}0Az+K \`�e3                        // 调整数组大小准备继续读取
O x(`#~W8r,i3
lUqa�k_.d3                        byte[] newBuf = new byte[buffer.Length * 2];3GEYE8sG9MGI1qA'k
3GEYE$j0um[2P8{VUw
                        Array.Copy(buffer, newBuf, buffer.Length);
Mc U4Qn8lj!GF3
&@ Od;xmP7s3                        newBuf[read] = (byte)nextByte;
0x+^`.tP D3
x1m%O-Q1I(o1u3                        buffer = newBuf;// buffer是一个引用(指针),这里意在重新设定buffer指针指向一个更大的内存
Lc4YU8z&l z3
i/j,[(Q}.lw3                        read++;
7I0UJ'P9ys0t3
3GEYEJ:N3W6WZ5xi&z
1 楼 tmj 2008-04-09  
怎么会被推荐?
2 楼 wuhua 2008-04-09  
?????
3 楼 jianglinchun 2008-04-09  
不要忘记实现了IDisposeable接口的还有using方法

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3