2017-04-19 10:59:44 |  0 Comments  |  method

递归算法

        通常,在遍历多重数据的时候,如果继续使用for循环,会显得代码庸众,代码效率不高,容易有重复遍历的可能,当数据量大的时候,这种方法就不可取了,随后想到之前学c时接触到的一个算法,递归算法,既能满足代码运行效率高的要求,代码看起来比较简洁。

        我要实现的功能其实不难,查找数据库中数据,根据每条的父id查找到同一父id下的其他同级数据,同一父id的做排序,同时,本条数据的id也可能是另一条的父id,一番绞尽脑汁之后,眼前一亮,思如泉涌...

        /// <summary>
        /// 根据ParentId将表中ArgenCode排序
        /// </summary>
        public void caulateRank()
        {
            RankArgen(0, argenAdo.GetArgenByParentId(0));
        }
        
        private void RankArgen(int id, List<Argen> SameParentList)
        {
            if (SameParentList[id].ParentArgen != 0)
            {
                //不为最高级
                Argen ParentArgen = argenAdo.GetArgenByArgenId(SameParentList[id].ParentArgen);
                string ParentCode = ParentArgen.ArgenCode;
                SameParentList[id].ArgenCode = ParentCode + (id + 1).ToString().PadLeft(ParentCode.Length, '0');
                argenAdo.ModifyArgen(SameParentList[id]);
                List<Argen> ChildList = argenAdo.GetArgenByParentId
 2017-04-19 10:59:44 |  2 Comments  |  method

关于守护进程算法

在最近项目中,主程序会因各种问题退出,为了防止这一现象出现,特地研究守护进程的实现,来守护主程序,守护进程的实现思路主要有两种:

1.守护进程对注册表中特定项值做递减,当值为0时系统重启,主程序中启动守护,并对注册标表中的特定项值赋初值切做递加,当主程序运行过程中,守护进程不会讲项值减到0,达到守护主进程的效果。

2.守护进程查找进程列表中是否有主进程,若没有则重启操作系统。

目前设置了主程序的开机自启动,所以重启操作系统就可以了。

 

方法一:

    public class RegistryEudemon
    {
        private RegistryHelper regHelper;
         private string baseSubKey = @"SOFTWARE\\";

        public RegistryEudemon()
        {
            regHelper = new RegistryHelper(baseSubKey, RegDomain.LocalMachine);
            //生成Eudemon项
            string subKey = regHelper.PathAdd(baseSubKey, @"\Eudemon");
            if (!regHelper.IsSubKeyExist(subKey))
            {
                regHelper.CreateSubKey(subKey);
            }
            regHelper.SubKey = subKey;
        }

        public void UpdateCount(int value)
        {
            regHelper.WriteRegeditKey(regHelper.PathAdd(baseSubKey, @"\Eudemon"), "count", value);
        }

        public int SubtractCount()
        {
            int cnt = int.Parse(regHelper.
 2016-10-13 14:22:13 |  2 Comments

关于编译链接的详解

        平常工作中经常会看到程序包里有.lib、.obj、.dll等文件,只是大概知道他们的作用,却没有深入了解,不知道他们是怎么来的,具体有什么用,知道今天了解makefile的时候才对这个有进一步的认识。

        一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执

行文件,这个动作叫作链接(link)。   
     
       编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可

以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 
       链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时

候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是

.lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

      总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而

在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定

函数的ObjectFile.

 2016-10-13 11:26:59 |  2 Comments

eclipse中NDK环境的配置与JNI编写驱动入门

        使用c/c++编写底层代码可以提高效率,基于这个原因,决定使用JNI的方式编写安卓底层驱动的代码。

        要进行jni的编写,就必须在eclipse下配置ndk,谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的

Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在执行

Cygwin,然后传递ndk-build作为参数,这样就能让Eclipse自动编译NDK了。

        我下的是目前最新的NDK版本,所以就不需要用到Cygwin,下好ndk后就可以开始配置了,配置完成后就可以开始jni的编写,编写的主要的流程是:

        1.先在java里声明要调用c的库和库函数;

        2.通过java命令生成.h文件;

        3.实现对应的c文件,c源码中实现库函数;

        4.自己编写Android.mk文件(makefile);

        5.保存更新,自动生成.so的库;

        6.java代码中调用;

    出自:  http://www.cnblogs.com/yejiurui/p/3476565.html

        

 2016-09-08 14:48:53 |  0 Comments

关于java与c# 3des加解密的区别

主要差异如下:

1、  对于待加密解密的数据,各自的填充模式不一样

      C#的模式有:ANSIX923、ISO10126、None、PKCS7、Zero,而Java有:NoPadding、PKCS5Padding、SSL3Padding

2、  各自默认的3DES实现,模式和填充方式不一样

C#的默认模式为CBC,默认填充方式为PKCS7; java的默认模式为ECB,默认填充方式为PKCS5Padding

3、  各自的key的size不一样

C#中key的size为16和24均可;java中要求key的size必须为24;对于CBC模式下的向量iv的size两者均要求必须为8

 

翻看了3DES的原理:

DES主要采用替换和移位的方法,用56位密钥对64位二进制数据块进行加密,每次加密可对64位的输入数据进行16轮编码,

经一系列替换和移位后,输入的64位转换成安全不同的64的输出数据

.   
3DES:是在DES的基础上采用三重DES,即用两个56位的密钥K1,K2,发送方用K1加密,K2解密,再使用K1加密.接收方使用K1解密,K2加密,再使用K1解密,

其效果相当于密钥长度加倍.

 

于是尝试在java中,对key进行补位,即用前8个字节作为byte[24] 中的byte[16]~byte[23];发现与c#中加密的结果相同!于是大胆假设C#中可能是检查key的size为16的时候

自动将前8个字节作为k3进行了补位,而java没有实现这一点(因为java的3DES算法中强制要求key的size必须为24)。这样的情况下,可能就是发送方用k1加密、k2解密、k3再加密;接受方k3解密、k2加密、再k1解密来实现。

 

最终经过编码验证,确认key大小为24时,java和c#的加密解密结果相一致。

Java中实现时,只要注意对大小不足24的key进行补位,和采用CBC模式,填充模式为PKCS5Padding即可。


在项目中发现用3des加密后传输到银行的数据解包不出的情况,通过对比,得知银行端使用java默认填充方式,故我这边c#端相应改变,下面具体介绍下pkcs7和pkcs5的填充方式:

PKCS #7 填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。

假定块长度为 8,数据长度为 9,
数据: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF F

 2016-08-30 13:44:06 |  0 Comments

关于“jQuery未定义”错误解决方法

在正确加载本地js文件后,调试网页仍然报错,提示“jQuery未定义”,检查语法没错的前提下找到一篇博客,上面提到“前后顺序规则”,原来的代码如下图:

基于这一规则,我把这两句换了个位置,记过就过了,由上,可知,有些语言对于语句的前后顺序是很严谨的!

Title - Artist
0:00