精华内容
下载资源
问答
  • Java批量解析微信dat文件,微信图片破解

    万次阅读 多人点赞 2019-07-11 15:50:58
    Java批量解析微信dat文件前言关于异或值怎么计算代码 前言 偶然看到有可以解密微信dat的文档,上网查了查,找到了一篇可以用的文章,不过转换过程代码是有问题...首先使用十六进制器打开微信dat文件,显示如下 文...

    前言

    偶然看到有可以解密微信dat的文档,上网查了查,找到了一篇可以用的文章,不过转换过程代码是有问题的,在这里改了下发布上来。
    附带依赖jdk8的微信图片破解小工具:链接:https://pan.baidu.com/s/1t_e5rMFKmIRDNQAfN5rtaQ
    提取码:ymw6

    关于异或值怎么计算

    首先使用十六进制器打开微信dat文件,显示如下
    微信dat文件
    jpg图片文件头一般为FF D8 开头的,所以此处使用科学计算器,计算异或值
    在这里插入图片描述
    在这里插入图片描述
    计算后的值
    在这里插入图片描述
    所以此处异或值就是0x9D

    代码

    以下是java代码,创建一个weChatImgRevert .java后复制进去就好啦。
    此处的jdk版本需要1.8以上…,另外三个参数需要改成自己的哦~

    package main.java.com.example.demo;
    
    import java.io.*;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.atomic.AtomicReference;
    
    public class weChatImgRevert {
    
        public static void main(String[] args) {
            String path = "C:\\Users\\Administrator\\Documents\\WeChat Files\\xxx\\FileStorage\\Image\\2019-07";
            String targetPath = "D:\\weChat\\2019-07\\";
            int xor = 0xCB;
            convert(path, targetPath, xor);
        }
    
        /**
         * @param path       图片地址
         * @param targetPath 转换后目录
         */
        private static void convert(String path, String targetPath, int xor) {
            File[] file = new File(path).listFiles();
            if (file == null) {
                return;
            }
            int size = file.length;
            System.out.println("总共" + size + "个文件");
            AtomicReference<Integer> integer = new AtomicReference<>(0);
            Arrays.stream(file).parallel().forEach(file1 -> {
                try (InputStream reader = new FileInputStream(file1);
                     OutputStream writer =
                             new FileOutputStream(targetPath + file1.getName().split("\\.")[0] + ".jpg")) {
                    byte[] bytes = new byte[1024 * 10];
                    int b;
                    while ((b = reader.read(bytes)) != -1) {//这里的in.read(bytes);就是把输入流中的东西,写入到内存中(bytes)。
                        for (int i = 0; i < bytes.length; i++) {
                            bytes[i] = (byte) (int) (bytes[i] ^ xor);
                            if (i == (b - 1)) {
                                break;
                            }
                        }
                        writer.write(bytes, 0, b);
                        writer.flush();
                    }
                    integer.set(integer.get() + 1);
                    System.out.println(file1.getName() + "(大小:" + ((double) file1.length() / 1000) + "kb),进度:" + integer.get() +
                            "/" + size);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            System.out.println("解析完毕!");
        }
    
        /**
         * 获取异或值,不一定准确,当解析不出来的时候,换一张图片的异或值来解析
         *
         * @param PhotoPath
         * @return
         */
        private static int getXor(String PhotoPath) {
            File file = new File(PhotoPath);
            try (InputStream reader = new FileInputStream(file)) {
                int[] xors = new int[4];
                xors[0] = reader.read() & 0xFF ^ 0xFF;
                xors[1] = reader.read() & 0xFF ^ 0xD8;
                reader.skip(file.length() - 1);
                xors[2] = reader.read() & 0xFF ^ 0xFF;
                xors[3] = reader.read() & 0xFF ^ 0xD9;
                Map<Integer, Integer> map = new HashMap<>();
                for (int xor : xors) {
                    if (map.containsKey(xor)) {
                        map.put(xor, map.get(xor) + 1);
                    } else {
                        map.put(xor, 1);
                    }
                }
                return map.values().stream().max(Integer::compareTo).get();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
    
    }
    

    执行main方法后就可以在目标文件夹中去看转换后的图片了
    以下是转换后的效果图片: 效果图

    第二种方式,适合不懂怎么计算,想直接用的代码

    以下是java代码,创建一个WxChatImgRevert.java后复制进去就好啦。
    此处的jdk版本需要1.8以上…,另外两个参数需要改成自己的哦~
    此处的原理是判断图片文件的十六进制特征码。

    package main.java.com.example.demo;
    
    import java.io.*;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.atomic.AtomicInteger;
    import java.util.concurrent.atomic.AtomicReference;
    
    public class WxChatImgRevert2 {
    
        public static void main(String[] args) {
            String path = "C:\\Users\\Administrator\\Documents\\WeChat Files\\xxx\\FileStorage";
            String targetPath = "D:\\weChat\\temp";
            convert(path, targetPath);
        }
    
        /**
         * @param path       图片目录地址
         * @param targetPath 转换后目录
         */
        private static void convert(String path, String targetPath) {
            File[] file = new File(path).listFiles();
            if (file == null) {
                return;
            }
            int size = file.length;
            System.out.println("总共" + size + "个文件");
            AtomicReference<Integer> integer = new AtomicReference<>(0);
            AtomicInteger x = new AtomicInteger();
            for (File file1 : file) {
                if (file1.isFile()) {
                    Object[] xori = getXor(file1);
                    if (xori != null && xori[1] != null){
                        x.set((int)xori[1]);
                    }
                    break;
                }
            }
            Arrays.stream(file).parallel().forEach(file1 -> {
                if (file1.isDirectory()) {
                    String[] newTargetPath = file1.getPath().split("/|\\\\");
                    File targetFile = new File(targetPath+File.separator+newTargetPath[newTargetPath.length - 1]);
                    if (!targetFile.exists()) {
                        targetFile.mkdirs();
                    }
                    convert(file1.getPath(),targetPath+File.separator+newTargetPath[newTargetPath.length - 1]);
                    return;
                }
                Object[] xor = getXor(file1);
                if (x.get() == 0 && xor[1] != null && (int) xor[1] != 0) {
                    x.set((int) xor[1]);
                }
                xor[1] = xor[1] == null ? x.get() : xor[1];
                try (InputStream reader = new FileInputStream(file1);
                     OutputStream writer =
                             new FileOutputStream(targetPath + File.separator + file1.getName().split("\\.")[0] + (xor[0] != null ?
                                     "." + xor[0] : ""))) {
                    byte[] bytes = new byte[1024 * 10];
                    int b;
                    while ((b = reader.read(bytes)) != -1) {//这里的in.read(bytes);就是把输入流中的东西,写入到内存中(bytes)。
                        for (int i = 0; i < bytes.length; i++) {
                            bytes[i] = (byte) (int) (bytes[i] ^ (int) xor[1]);
                            if (i == (b - 1)) {
                                break;
                            }
                        }
                        writer.write(bytes, 0, b);
                        writer.flush();
                    }
                    integer.set(integer.get() + 1);
                    System.out.println(file1.getName() + "(大小:" + ((double) file1.length() / 1000) + "kb,异或值:" + xor[1] + ")," +
                            "进度:" + integer.get() +
                            "/" + size);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            System.out.println("解析完毕!");
        }
    
        /**
         * 判断图片异或值
         *
         * @param file
         * @return
         */
        private static Object[] getXor(File file) {
            Object[] xor = null;
            if (file != null) {
                byte[] bytes = new byte[4];
                try (InputStream reader = new FileInputStream(file)) {
                    reader.read(bytes, 0, bytes.length);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                xor = getXor(bytes);
            }
            return xor;
        }
    
        /**
         * @param bytes
         * @return
         */
        private static Object[] getXor(byte[] bytes) {
            Object[] xorType = new Object[2];
            int[] xors = new int[3];
            for (Map.Entry<String, String> type : FILE_TYPE_MAP.entrySet()) {
                String[] hex = {
                        String.valueOf(type.getKey().charAt(0)) + type.getKey().charAt(1),
                        String.valueOf(type.getKey().charAt(2)) + type.getKey().charAt(3),
                        String.valueOf(type.getKey().charAt(4)) + type.getKey().charAt(5)
                };
                xors[0] = bytes[0] & 0xFF ^ Integer.parseInt(hex[0], 16);
                xors[1] = bytes[1] & 0xFF ^ Integer.parseInt(hex[1], 16);
                xors[2] = bytes[2] & 0xFF ^ Integer.parseInt(hex[2], 16);
                if (xors[0] == xors[1] && xors[1] == xors[2]) {
                    xorType[0] = type.getValue();
                    xorType[1] = xors[0];
                    break;
                }
            }
            return xorType;
        }
    
        private final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();
    
        static {
            getAllFileType();
        }
    
        private static void getAllFileType() {
            FILE_TYPE_MAP.put("ffd8ffe000104a464946", "jpg"); //JPEG (jpg)
            FILE_TYPE_MAP.put("89504e470d0a1a0a0000", "png"); //PNG (png)
            FILE_TYPE_MAP.put("47494638396126026f01", "gif"); //GIF (gif)
            FILE_TYPE_MAP.put("49492a00227105008037", "tif"); //TIFF (tif)
            FILE_TYPE_MAP.put("424d228c010000000000", "bmp"); //16色位图(bmp)
            FILE_TYPE_MAP.put("424d8240090000000000", "bmp"); //24位位图(bmp)
            FILE_TYPE_MAP.put("424d8e1b030000000000", "bmp"); //256色位图(bmp)
            FILE_TYPE_MAP.put("41433130313500000000", "dwg"); //CAD (dwg)
            FILE_TYPE_MAP.put("3c21444f435459504520", "html"); //HTML (html)
            FILE_TYPE_MAP.put("3c21646f637479706520", "htm"); //HTM (htm)
            FILE_TYPE_MAP.put("48544d4c207b0d0a0942", "css"); //css
            FILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); //js
            FILE_TYPE_MAP.put("7b5c727466315c616e73", "rtf"); //Rich Text Format (rtf)
            FILE_TYPE_MAP.put("38425053000100000000", "psd"); //Photoshop (psd)
            FILE_TYPE_MAP.put("46726f6d3a203d3f6762", "eml"); //Email [Outlook Express 6] (eml)
            FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "doc"); //MS Excel 注意:word、msi 和 excel的文件头一样
            FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "vsd"); //Visio 绘图
            FILE_TYPE_MAP.put("5374616E64617264204A", "mdb"); //MS Access (mdb)
            FILE_TYPE_MAP.put("252150532D41646F6265", "ps");
            FILE_TYPE_MAP.put("255044462d312e360d25", "pdf"); //Adobe Acrobat (pdf)
            FILE_TYPE_MAP.put("2e524d46000000120001", "rmvb"); //rmvb/rm相同
            FILE_TYPE_MAP.put("464c5601050000000900", "flv"); //flv与f4v相同
            FILE_TYPE_MAP.put("00000020667479706973", "mp4");
            FILE_TYPE_MAP.put("49443303000000000f76", "mp3");
            FILE_TYPE_MAP.put("000001ba210001000180", "mpg"); //
            FILE_TYPE_MAP.put("3026b2758e66cf11a6d9", "wmv"); //wmv与asf相同
            FILE_TYPE_MAP.put("524946464694c9015741", "wav"); //Wave (wav)
            FILE_TYPE_MAP.put("52494646d07d60074156", "avi");
            FILE_TYPE_MAP.put("4d546864000000060001", "mid"); //MIDI (mid)
            FILE_TYPE_MAP.put("504b0304140000000800", "zip");
            FILE_TYPE_MAP.put("526172211a0700cf9073", "rar");
            FILE_TYPE_MAP.put("235468697320636f6e66", "ini");
            FILE_TYPE_MAP.put("504b03040a0000000000", "jar");
            FILE_TYPE_MAP.put("4d5a9000030000000400", "exe");//可执行文件
            FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");//jsp文件
            FILE_TYPE_MAP.put("4d616e69666573742d56", "mf");//MF文件
            FILE_TYPE_MAP.put("3c3f786d6c2076657273", "xml");//xml文件
            FILE_TYPE_MAP.put("efbbbf2f2a0d0a53514c", "sql");//xml文件
            FILE_TYPE_MAP.put("7061636b616765207765", "java");//java文件
            FILE_TYPE_MAP.put("406563686f206f66660d", "bat");//bat文件
            FILE_TYPE_MAP.put("1f8b0800000000000000", "gz");//gz文件
            FILE_TYPE_MAP.put("6c6f67346a2e726f6f74", "properties");//bat文件
            FILE_TYPE_MAP.put("cafebabe0000002e0041", "class");//bat文件
            FILE_TYPE_MAP.put("49545346030000006000", "chm");//bat文件
            FILE_TYPE_MAP.put("04000000010000001300", "mxp");//bat文件
            FILE_TYPE_MAP.put("504b0304140006000800", "docx");//docx文件
            FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "wps");//WPS文字wps、表格et、演示dps都是一样的
            FILE_TYPE_MAP.put("6431303a637265617465", "torrent");
            FILE_TYPE_MAP.put("494d4b48010100000200", "264");
    
    
            FILE_TYPE_MAP.put("6D6F6F76", "mov"); //Quicktime (mov)
            FILE_TYPE_MAP.put("FF575043", "wpd"); //WordPerfect (wpd)
            FILE_TYPE_MAP.put("CFAD12FEC5FD746F", "dbx"); //Outlook Express (dbx)
            FILE_TYPE_MAP.put("2142444E", "pst"); //Outlook (pst)
            FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); //Quicken (qdf)
            FILE_TYPE_MAP.put("E3828596", "pwl"); //Windows Password (pwl)
            FILE_TYPE_MAP.put("2E7261FD", "ram"); //Real Audio (ram)
        }
    }
    

    简要介绍下小工具:
    打开小工具后的页面是这样子的,如果没有安装jdk8的话,可以在这里下载安装,不然是运行不了的

    在这里插入图片描述
    微信的数据存储地址一般是:C:\Users\Administrator\Documents\WeChat Files\xxx
    可以整个扔进去,但是要注意,输出地址一定不能和存储地址相同,最好不要在同一个文件夹里面!!!
    本质上,第一个是读取操作,第二个是写入操作,读取并不会破坏原文件,但是写入如果是同一个文件夹,并且存在同名文件,会被覆盖掉。转换后就是在你指定的输出目录里面
    在这里插入图片描述
    ps:小工具是花了一晚上随手写的,楼主估计都找不到源码在哪里了,所以将就着用吧。

    参考文档
    [1]: https://blog.csdn.net/weixin_42440768/article/details/88870077
    [2]: https://www.jianshu.com/p/782730f7f016

    展开全文
  • 嵌入式linux开发实用工具小程序

    千次阅读 2018-11-26 19:04:49
    (一)十六进制字符整型数字(二)字符串整型(三)创建文件并填充固定数据(四)批量处理图片(五)海思HI3520 IO控制小程序(六)路由追踪(七)文件固定位置插入数据(七)H264 I帧与P帧偏移(八)获取本地IP...

    Table of Contents

    (一)十六进制字符转整型数字

    (二)字符串转整型

    (三)创建文件并填充固定数据

    (四)批量处理图片

    (五)海思HI3520 IO控制小程序

    (六)路由追踪

    (七)文件固定位置插入数据

    (七)H264 I帧与P帧偏移

    (八)获取本地IP地址


        在学习和工作开发的时候,经常需要使用到各种各样不太常用的操作,这种情况一般是自己手动写一些小程序来处理。因为它们不太常用,所以经常用了又没保存,等到下一次在使用的时候又需要重写,这样的非常浪费时间和精力。所以想在这里统一记录一下,以备下次重新使用。代码以实用为主,如果缺陷,欢迎指出。


    (一)十六进制字符转整型数字

        功能:将16进制的字符串转换为10进制的数字。我是没有找到相应的库函数,所以参考网上的代码自己手动写了个函数来实现。常用的函数有atoi,atol,他们都是将10进制的数字字符串转换为int或是long类型,所以在有些情况下不适用。

    /*=============================================================================
    #     FileName: hex2dec.cpp
    #         Desc: Convert a hex string to a int number
    #       Author: Caibiao Lee
    #      Version: 
    #   LastChange: 2018-11-26 
    #      History:
    =============================================================================*/
    
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <ctype.h>
    
    int c2i(char ch)  
    {  
        // 如果是数字,则用数字的ASCII码减去48, 如果ch = '2' ,则 '2' - 48 = 2  
        if(isdigit(ch))  
                return ch - 48;  
    
        // 如果是字母,但不是A~F,a~f则返回  
        if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' )  
                return -1;  
    
        // 如果是大写字母,则用数字的ASCII码减去55, 如果ch = 'A' ,则 'A' - 55 = 10  
        // 如果是小写字母,则用数字的ASCII码减去87, 如果ch = 'a' ,则 'a' - 87 = 10  
        if(isalpha(ch))  
                return isupper(ch) ? ch - 55 : ch - 87;  
    
        return -1;  
    } 
    
    int hex2dec(char *hex)  
    {  
        int len;  
        int num = 0;  
        int temp;  
        int bits;  
        int i;  
        char str[64] = {0};
    
    	if(NULL==hex)
    	{
    		printf("input para error \n");
    		return 0;
    	}
    
    
    	if(('0'==hex[0])&&(('X'==hex[1])||('x'==hex[1])))
    	{
    		strcpy(str,&hex[2]);
    	}else
    	{
    		strcpy(str,hex);
    	}
    	
    	printf("input num = %s \n",str);
    	
        // 此例中 str = "1de" 长度为3, hex是main函数传递的  
        len = strlen(str);  
    
        for (i=0, temp=0; i<len; i++, temp=0)  
        {  
                // 第一次:i=0, *(str + i) = *(str + 0) = '1', 即temp = 1  
                // 第二次:i=1, *(str + i) = *(str + 1) = 'd', 即temp = 13  
                // 第三次:i=2, *(str + i) = *(str + 2) = 'd', 即temp = 14  
                temp = c2i( *(str + i) );  
                // 总共3位,一个16进制位用 4 bit保存  
                // 第一次:'1'为最高位,所以temp左移 (len - i -1) * 4 = 2 * 4 = 8 位  
                // 第二次:'d'为次高位,所以temp左移 (len - i -1) * 4 = 1 * 4 = 4 位  
                // 第三次:'e'为最低位,所以temp左移 (len - i -1) * 4 = 0 * 4 = 0 位  
                bits = (len - i - 1) * 4;  
                temp = temp << bits;  
    
                // 此处也可以用 num += temp;进行累加  
                num = num | temp;  
        }  
    
        // 返回结果  
        return num;  
    }  
    
    int main(int argc, char **argv)
    {
    	int l_s32Ret = 0;
    	
    	if(2!=argc)
    	{
    		printf("=====ERROR!======\n");
    		printf("usage: %s Num \n", argv[0]);
    		printf("eg 1: %s 0x400\n", argv[0]);
    		return 0;
    	}
    
    	l_s32Ret = hex2dec(argv[1]);
    	printf("value hex = 0x%x \n",l_s32Ret);
    	printf("value dec = %d \n",l_s32Ret);
    	return 0;
    }
    

    运行结果: 

    biao@ubuntu:~/test/flash$ ./a.out 0x400
    input num = 400 
    value hex = 0x400 
    value dec = 1024 
    biao@ubuntu:~/test/flash$ 

    (二)字符串转整型

         功能:将正常输入的16进制或是10进制的字符串转换为int数据类型

    /*=============================================================================
    #     FileName: hex2dec.cpp
    #         Desc: Convert a hex/dec string to a int number
    #       Author: Caibiao Lee
    #      Version: 
    #   LastChange: 2018-12-03 
    #      History:
    =============================================================================*/
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <ctype.h>
    
    int String2int(char *strChar)
    {
    	int len=0;
    	const char *pstrCmp1="0123456789ABCDEF";
    	const char *pstrCmp2="0123456789abcdef";
    	
    	char *pstr=NULL;
    	int uiValue=0;
    	int j=0;	
    	unsigned int t=0;
    	int i=0;
    	if(NULL==strChar)
    		return -1;
    	if(0>=(len=strlen((const char *)strChar)))
    		return -1;
    	if(NULL!=(pstr=strstr(strChar,"0x"))||NULL!=(pstr=strstr(strChar,"0X")))
    	{
    		pstr=(char *)strChar+2;
    		
    		if(0>=(len=strlen((const char *)pstr)))
    			return -1;
    		for(i=(len-1);i>=0;i--)
    		{
    			if(pstr[i]>'F')
    			{
    				for(t=0;t<strlen((const char *)pstrCmp2);t++)
    				{	
    					if(pstrCmp2[t]==pstr[i])
    						uiValue|=(t<<(j++*4));
    				}
    			}
    			else
    			{
    				for(t=0;t<strlen((const char *)pstrCmp1);t++)
    				{	
    					if(pstrCmp1[t]==pstr[i])
    						uiValue|=(t<<(j++*4));
    				}
    			}
    		}
    	}
    	else
    	{
    		uiValue=atoi((const char*)strChar);
    	}
    	return uiValue;
    }
    
    int main(int argc, char **argv)
    {
    	int l_s32Ret = 0;
    		
    	if(2!=argc)
    	{
    		printf("=====ERROR!======\n");
    		printf("usage: %s Num \n", argv[0]);
    		printf("eg 1: %s 0x400\n", argv[0]);
    		return 0;
    	}
    	l_s32Ret = String2int(argv[1]);
    	printf("value hex = 0x%x \n",l_s32Ret);
    	printf("value dec = %d \n",l_s32Ret);
    	return 0;
    }
    

    (三)创建文件并填充固定数据

        功能:创建固定大小的一个文件,并且把这个文件填充为固定的数据。

    /*=============================================================================
    #     FileName: CreateFile.cpp
    #         Desc: 创建固定大小的文件,然后填充固定的数据
    #       Author: Caibiao Lee
    #      Version: 
    #   LastChange: 2018-11-26 
    #      History:
    =============================================================================*/
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <ctype.h>
    
    //#define	FILL_DATA_VALUE		0xff
    #define	FILL_DATA_VALUE		0x30 //char 0
    
    int c2i(char ch)  
    {  
        if(isdigit(ch))  
                return ch - 48;  
    
        if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' )  
                return -1;  
    
        if(isalpha(ch))  
                return isupper(ch) ? ch - 55 : ch - 87;  
    
        return -1;  
    } 
    
    int hex2dec(char *hex)  
    {  
        int len;  
        int num = 0;  
        int temp;  
        int bits;  
        int i;  
        char str[64] = {0};
    
    	if(NULL==hex)
    	{
    		printf("input para error \n");
    		return 0;
    	}
    
    	if(('0'==hex[0])&&(('X'==hex[1])||('x'==hex[1])))
    	{
    		strcpy(str,&hex[2]);
    	}else
    	{
    		strcpy(str,hex);
    	}
    	
    	printf("input num = %s \n",str);
    	
        len = strlen(str);  
    
        for (i=0, temp=0; i<len; i++, temp=0)  
        {  
                temp = c2i( *(str + i) );  
    
                bits = (len - i - 1) * 4;  
                temp = temp << bits;  
    
                num = num | temp;  
        }  
        return num;  
    }  
    
    int main(int argc, char **argv)
    {
    	FILE *l_pFile = NULL;
    	int 	l_s32Rest = 0;
    	unsigned int l_WriteLen = 0;
    	unsigned int l_FileLen = 0;
    	unsigned char TempData[1024] = {FILL_DATA_VALUE};
    
    	if(3!=argc)
    	{
    		printf("usage: %s FileName  FileLen \n ", argv[0]);
    		printf("eg: %s ./Outfile.bin 0x400 \n ", argv[0]);
    		return 0;
    	};
    
    	const char *l_pFileName = argv[1];
    	if(NULL==l_pFileName)
    	{
    		printf("input file name is NULL \n");
    		return -1;
    	}
    	
    	if(('0'==argv[2][0])&&(('X'==argv[2][1])||('x'==argv[2][1])))
    	{
    		l_FileLen = hex2dec(argv[2]);
    		
    	}else
    	{
    		l_FileLen = atoi(argv[2]);
    	}
    	
    	printf("Need To Write Data Len %d \n",l_FileLen);
    	printf("Fill Data Vale = 0x%x \n",FILL_DATA_VALUE);
    	
    	for(int i=0;i<1024;i++)
    	{
    		TempData[i] = FILL_DATA_VALUE;
    	}
    	
    
    	l_pFile = fopen(l_pFileName,"w+");
    	if(l_pFile==NULL)
    	{
    		printf("open file %s error \n",l_pFileName);
    		return -1;
    	}
    
    	
    	while(l_WriteLen<l_FileLen)
    	{
    		if(l_FileLen<1024)
    		{
    			l_s32Rest = fwrite(TempData,1,l_FileLen,l_pFile);
    			
    		}
    		else
    		{
    			l_s32Rest = fwrite(TempData,1,1024,l_pFile);
    		}
    
    		if(l_s32Rest <= 0)
    		{
    			break;
    		};
    
    		l_WriteLen +=l_s32Rest; 
    	}
    	
    	if(NULL!=l_pFile)
    	{
    		fclose(l_pFile);
    		l_pFile = NULL;
    	}
    
    	return 0;
    
    }
    
    

    运行结果:

    biao@ubuntu:~/test/flash$ gcc CreateFile.cpp 
    biao@ubuntu:~/test/flash$ ls
    a.out  CreateFile.cpp  hex2dec.cpp  main.cpp  out.bin
    biao@ubuntu:~/test/flash$ ./a.out ./out.bin 0x10
    input num = 10 
    Need To Write Data Len 16 
    Fill Data Vale = 0x30 
    biao@ubuntu:~/test/flash$ ls
    a.out  CreateFile.cpp  hex2dec.cpp  main.cpp  out.bin
    biao@ubuntu:~/test/flash$ vim out.bin 
      1 0000000000000000                                     

    (四)批量处理图片

    功能:批处理将图片前面固定的字节数删除。

    /*=============================================================================
    #     FileName: CutFile.cpp
    #         Desc: 批量处理,将图片的前面固定字节删除
    #       Author: Caibiao Lee
    #      Version: 
    #   LastChange: 2018-11-26 
    #      History:
    =============================================================================*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/stat.h>
    
    
    #define START_READ_POSITION		128
    #define PHOTO_START_TIME		83641
    //l_s32PhotoTime = 92809;
    
    int Cut_file(char * InputFile)
    {
    	FILE *l_pFileInput = NULL;
    	FILE *l_pFileOutput = NULL;
    	char l_ars8OutputName[128] = {0};
    	unsigned char l_arru8TempData[1024] = {0};
    	int l_s32Ret = 0;
    	static unsigned int ls_u32Num = 0;
    
    	
    	if(NULL== InputFile) 
    	{
    		goto ERROR;
    	}
    	
    	//sprintf(l_ars8OutputName,"./outfile/_%s",&InputFile[8]);
    	sprintf(l_ars8OutputName,"./outfile/00%d.jpg",ls_u32Num++);
    
    	//printf("out file name %s \n",l_ars8OutputName);
    	
    	l_pFileInput = fopen(InputFile,"rb+");
    	if(NULL==l_pFileInput)
    	{
    		printf("input file open error\n");
    		goto ERROR;
    	}
    
    	l_pFileOutput = fopen(l_ars8OutputName,"w+");
    	if(NULL==l_pFileOutput)
    	{
    		printf("out file open error\n");
    		goto ERROR;
    	}
    
    	fseek(l_pFileInput,START_READ_POSITION,SEEK_SET);
    
    	while(!feof(l_pFileInput))
    	{
    		l_s32Ret = fread(l_arru8TempData,1,1024,l_pFileInput);
    		if(l_s32Ret<0)
    		{
    			break;
    		}
    
    		l_s32Ret = fwrite(l_arru8TempData,1,l_s32Ret,l_pFileOutput);
    		if(l_s32Ret<0)
    		{
    			break;
    		}
    	}
    
    ERROR:
    	if(NULL!=l_pFileOutput)
    	{
    		fclose(l_pFileOutput);
    		l_pFileOutput =NULL;
    	};
    
    	if(NULL !=l_pFileInput);
    	{
    		fclose(l_pFileInput);
    		l_pFileInput =NULL;
    	}
    }
    
    int main(void)
    {
    	char l_arrs8InputName[128] = {0};
    	char l_s8PhotoChannel = 0;
    	int  l_s32PhotoTime = 0;
    
    	l_s8PhotoChannel = 3;
    	l_s32PhotoTime = PHOTO_START_TIME;
    
    	/**从第一通道开始**/
    	for(int j=1;j<l_s8PhotoChannel;j++)
    	{
    	
    		for(int i=l_s32PhotoTime;i<235959;i++)
    		{
    			memset(l_arrs8InputName,0,sizeof(l_arrs8InputName));
    			sprintf(l_arrs8InputName,"./image/%dY%06d.jpg",j,i);
    	
    			if(0==access(l_arrs8InputName,F_OK))
    			{
    				printf("%s\n",l_arrs8InputName);
    				Cut_file(l_arrs8InputName);				
    			}
    		}
    	}
    }
    

    运行结果:

    biao@ubuntu:~/test/photo$ gcc CutFile.cpp 
    biao@ubuntu:~/test/photo$ ls
    a.out  CutFile.cpp  image  outfile
    biao@ubuntu:~/test/photo$ ./a.out 
    ./image/1Y083642.jpg
    ./image/1Y083714.jpg
    ./image/1Y083747.jpg
    ./image/1Y083820.jpg
    ./image/1Y083853.jpg
    ./image/1Y083925.jpg
    ./image/1Y084157.jpg
    ./image/1Y084228.jpg
    ./image/1Y084301.jpg
    ./image/1Y084334.jpg
    ./image/1Y084406.jpg
    ./image/1Y084439.jpg
    ./image/1Y084711.jpg
    ./image/1Y084742.jpg
    ./image/1Y173524.jpg
    ./image/1Y173556.jpg
    ./image/1Y173629.jpg
    ./image/1Y173702.jpg
    ./image/1Y173933.jpg
    ./image/1Y174004.jpg
    ./image/1Y174244.jpg
    ./image/1Y174315.jpg
    ./image/1Y174348.jpg
    ./image/1Y174420.jpg
    ./image/1Y174454.jpg
    ./image/1Y174733.jpg
    biao@ubuntu:~/test/photo$ tree
    .
    ├── a.out
    ├── CutFile.cpp
    ├── image
    │   ├── 1Y083642.jpg
    │   ├── 1Y083714.jpg
    │   ├── 1Y083747.jpg
    │   ├── 1Y083820.jpg
    │   ├── 1Y083853.jpg
    │   ├── 1Y083925.jpg
    │   ├── 1Y084157.jpg
    │   ├── 1Y084228.jpg
    │   ├── 1Y084301.jpg
    │   ├── 1Y084334.jpg
    │   ├── 1Y084406.jpg
    │   ├── 1Y084439.jpg
    │   ├── 1Y084711.jpg
    │   ├── 1Y084742.jpg
    │   ├── 1Y173524.jpg
    │   ├── 1Y173556.jpg
    │   ├── 1Y173629.jpg
    │   ├── 1Y173702.jpg
    │   ├── 1Y173933.jpg
    │   ├── 1Y174004.jpg
    │   ├── 1Y174244.jpg
    │   ├── 1Y174315.jpg
    │   ├── 1Y174348.jpg
    │   ├── 1Y174420.jpg
    │   ├── 1Y174454.jpg
    │   └── 1Y174733.jpg
    └── outfile
        ├── 000.jpg
        ├── 0010.jpg
        ├── 0011.jpg
        ├── 0012.jpg
        ├── 0013.jpg
        ├── 0014.jpg
        ├── 0015.jpg
        ├── 0016.jpg
        ├── 0017.jpg
        ├── 0018.jpg
        ├── 0019.jpg
        ├── 001.jpg
        ├── 0020.jpg
        ├── 0021.jpg
        ├── 0022.jpg
        ├── 0023.jpg
        ├── 0024.jpg
        ├── 0025.jpg
        ├── 002.jpg
        ├── 003.jpg
        ├── 004.jpg
        ├── 005.jpg
        ├── 006.jpg
        ├── 007.jpg
        ├── 008.jpg
        └── 009.jpg
    
    2 directories, 54 files
    biao@ubuntu:~/test/photo$ 

        运行前需要创建两个目录,image用来存放需要处理的图片,outfile用来存放处理过后的文件。这种处理文件批处理方式很暴力,偶尔用用还是可以的。


    (五)海思HI3520 IO控制小程序

    嵌入式设备系统一般为了节省空间,一般都会对系统进行裁剪,所以很多有用的命令都会被删除。在嵌入式设备中要调试代码也是比较麻烦的,一般只能看串口打印。现在写了个小程序,专门用来查看和控制海思Hi3520DV300芯片的IO电平状态。

    /*=============================================================================
    #     FileName: Hi3520_IO_CTRL.cpp
    #         Desc: Hi3520DV300 IO Write and  Read
    #       Author: Caibiao Lee
    #      Version: 
    #   LastChange: 2018-11-30
    #      History:
    =============================================================================*/
    #include <stdio.h>
    #include <stdlib.h>
    #include "hstGpioAL.h"
    
    int PrintfInputTips(char *ps8Name)
    {
    	printf("=========== error!!! ========\n\n");
    	printf("usage Write: %s GPIO bit value \n", ps8Name);
    	printf("usage Read : %s GPIO bit \n", ps8Name);
    	printf("eg Write 1 to GPIO1_bit02  :     %s 1 2 1\n", ps8Name);
    	printf("eg Read  GPIO1_bit02 Value :     %s 1 2 \n\n", ps8Name);
    	
    	printf("=============BT20==================\n")
    	printf("USB HUB    GPIO_0_2  1_UP; 0_Down \n");
    	printf("RESET_HD   GPIO_13_0 0_EN; 1_disEN\n");
    	printf("Power_HD   GPIO_13_3 1_UP; 0_Down \n");
    	return 0;
    }
    
    int main(int argc, char **argv)
    {
    	if((3!=argc)&&(4!=argc))
    	{
    		PrintfInputTips(argv[0]);
    		return -1;
    	}
    	
    	unsigned char l_u8GPIONum = 0;
    	unsigned char l_u8GPIOBit = 0;
    	unsigned char l_u8SetValue = 0;
    
    	GPIO_GROUP_E  l_eGpioGroup;
    	GPIO_BIT_E	  l_eBit;
    	GPIO_DATA_E   l_eData;
    
    	l_u8GPIONum   = atoi(argv[1]);
    	l_u8GPIOBit   = atoi(argv[2]);
    
    	if(l_u8GPIONum<14)
    	{
    		l_eGpioGroup = (GPIO_GROUP_E)l_u8GPIONum;
    	}else
    	{
    		printf("l_u8GPIONum error l_u8GPIONum = %d\n",l_u8GPIONum);
    		return -1;
    	};
    
    	if(l_u8GPIOBit<8)
    	{
    		l_eBit = (GPIO_BIT_E)l_u8GPIOBit;
    	}else
    	{
    		printf("l_u8GPIOBit error l_u8GPIOBit = %d\n",l_u8GPIOBit);
    		return -1;
    	}
    
    	if(NULL!=argv[3])
    	{
    		l_u8SetValue = atoi(argv[3]);
    		if(0==l_u8SetValue)
    		{
    			l_eData = (GPIO_DATA_E)l_u8SetValue;
    		}else if(1==l_u8SetValue)
    		{
    			l_eData = (GPIO_DATA_E)l_u8SetValue;
    		}else
    		{
    			printf("l_u8SetValue error l_u8SetValue = %d\n",l_u8SetValue);
    		}
    	}
    	
    	if(3==argc)                                                       
    	{/**read**/                                                                                                                                                      
    	    printf("read GPIO%d Bit%d \n",l_u8GPIONum,l_u8GPIOBit);           
            /**set input**/                                               
            HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_INPUT);                        
                                                                                              
    	    /**read **/                                                                               
    	    char l_s8bit_val = 0;                                                                     
    	    HstGpio_Get_Value(l_eGpioGroup, l_eBit, &l_s8bit_val);                                    
    	                                                                                              
    	    printf("read Data = %d \n",l_s8bit_val);                                                  
    	                                                                                                
    	  }else if(4==argc)                                                                             
    	  {/**write**/                                                                                                                                                                            
    	      printf("Write GPIO %d; Bit %d; Value %d\n",l_u8GPIONum,l_u8GPIOBit,l_u8SetValue);         
    	                                                                                                
    	      /***set IO output*/                                                                       
    	      HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_OUPUT);                                  
    	                                                                                                
    	      /**Write To IO**/ 
    		  HstGpio_Set_Value(l_eGpioGroup,l_eBit,l_eData);
    	  }else                                            
    	  {                                                                                             
    	                                                                                                
    	  }
    
    	return 0;
    
    }
    
    

        完整工程代码下载地址:Hi3520DV300 IO读写应用小程序


    (六)路由追踪

    路由追踪用来查看网络路由状态,在linux设备中,可以使用traceroute 和tracepath 命令来跟踪路由。在我UbuntuPC端我使用tracepath跟踪我主机到百度的路由如下:

    biao@ubuntu:~$ 
    biao@ubuntu:~$ 
    biao@ubuntu:~$ tracepath www.baidu.com
     1?: [LOCALHOST]                                         pmtu 1500
     1:  192.168.20.254                                        1.425ms 
     1:  192.168.20.254                                        1.733ms 
     2:  10.10.10.254                                          1.997ms 
     3:  10.10.10.254                                          1.522ms pmtu 1492
     3:  100.64.0.1                                           10.884ms 
     4:  113.106.44.49                                         4.968ms asymm  5 
     5:  202.105.158.77                                        4.629ms 
     6:  113.96.4.42                                          11.837ms 
     7:  no reply
     8:  14.29.121.190                                         9.454ms 
     9:  no reply
    10:  no reply
    11:  no reply
    12:  no reply
    13:  no reply
    14:  no reply
    15:  no reply
    ^C
    biao@ubuntu:~$ 

    在我一台使用移动物联网卡的设备上运行traceroute,它是4G卡拨号上网的,他的路由情况如下:

    ~ # 
    ~ # 
    ~ # traceroute www.baidu.com
    traceroute to www.baidu.com (111.13.100.92), 30 hops max, 38 byte packets
     1  *  192.168.16.17 (192.168.16.17)  177.186 ms  79.267 ms
     2  *  *  *
     3  117.132.190.74 (117.132.190.74)  68.455 ms  51.361 ms  59.812 ms
     4  *  *  *
     5  221.183.38.90 (221.183.38.90)  83.953 ms  87.263 ms  74.621 ms
     6  111.13.98.101 (111.13.98.101)  81.521 ms  111.13.98.93 (111.13.98.93)  77.664 ms  111.13.98.101 (111.13.98.101)  79.678 ms
     7  *  *  111.13.112.57 (111.13.112.57)  418.551 ms
     8  *  *  *
     9  *  *  *
    10  *

    (七)文件固定位置插入数据

           在文件的固定位置插入固定的数据

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BASIC_FILE_NAME		"./nandflash.bin"
    #define UBOOT_FILE_NAME		"./u-boot.bin"
    #define KERNEL_FILE_NAME	"./kernel.bin"
    #define ROOTFS_FILE_NAME	"./rootfs.bin"
    #define APP_FILE_NAME		"./app.bin"
    
    
    #define UBOOT_POSITION		0x00
    #define KERNEL_POSITION		0x100000
    #define ROOTFS_POSITION		0x500000
    #define APP_POSITION		0x2700000
    
    
    
    int InsertData(FILE *pfBasic,FILE *psInsert,int s32Position)
    {
    	int l_S32Ret = 0;
    	unsigned char l_arru8Temp[1024] = {0xff};
    	
    	fseek(pfBasic,s32Position,SEEK_SET);
    	fseek(psInsert,0,SEEK_SET);
    	while(1)
    	{
    		l_S32Ret = fread(l_arru8Temp,1,1024,psInsert);
    		if(l_S32Ret > 0)
    		{
    			l_S32Ret = fwrite(l_arru8Temp,1,l_S32Ret,pfBasic);
    			if(l_S32Ret<=0)
    			{
    				printf("line %d error l_S32Ret = %d \n",__LINE__,l_S32Ret);
    				return -1;
    			}
    		}else
    		{
    			break;
    		}
    	}
    	
    	return 0;
    }
    
    
    
    int main(void)
    {
    	int l_s32Ret = 0;
    	FILE *l_pfBasec = NULL;
    	FILE *l_pfUboot = NULL;
    	FILE *l_pfKernel = NULL;
    	FILE *l_pfRootfs = NULL;
    	FILE *l_pfApp = NULL;
    
    
    	l_pfBasec = fopen(BASIC_FILE_NAME,"r+");
    	if(NULL==l_pfBasec)
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	l_pfUboot = fopen(UBOOT_FILE_NAME,"r");
    	if(NULL==l_pfUboot)
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	l_pfKernel = fopen(KERNEL_FILE_NAME,"r");
    	if(NULL==l_pfKernel)
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	l_pfRootfs = fopen(ROOTFS_FILE_NAME,"r");
    	if(NULL==l_pfRootfs)
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	l_pfApp = fopen(APP_FILE_NAME,"r");
    	if(NULL==l_pfApp)
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	if(0> InsertData(l_pfBasec,l_pfUboot,UBOOT_POSITION))
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	if(0> InsertData(l_pfBasec,l_pfKernel,KERNEL_POSITION))
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	if(0> InsertData(l_pfBasec,l_pfRootfs,ROOTFS_POSITION))
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    	if(0> InsertData(l_pfBasec,l_pfApp,APP_POSITION))
    	{
    		printf("line %d error \n",__LINE__);
    		goto ERROR;
    	}
    
    
    ERROR:
    	if(NULL!=l_pfBasec)
    	{
    		fclose(l_pfBasec);
    		l_pfBasec = NULL;
    	}
    
    	if(NULL!=l_pfUboot)
    	{
    		fclose(l_pfUboot);
    		l_pfUboot = NULL;
    	}
    	
    	if(NULL!=l_pfKernel)
    	{
    		fclose(l_pfKernel);
    		l_pfKernel = NULL;
    	}
    	
    	
    	if(NULL!=l_pfRootfs)
    	{
    		fclose(l_pfRootfs);
    		l_pfRootfs = NULL;
    	}
    	
    	if(NULL!=l_pfApp)
    	{
    		fclose(l_pfApp);
    		l_pfApp = NULL;
    	}
    	
    	return 0;
    
    }
    

    (七)H264 I帧与P帧偏移

        在H264存储的时候,P帧比I帧存储得快了14帧,需要将所有的P帧往后移动14帧。

    #include <stdio.h>
    #include <malloc.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/time.h>
    #include <errno.h> 
    
    /************************************************* 
    Function:    FindStartCode3  
    Description: 判断是否为0x00000001,如果是返回1     
    Return: 
    Others:
    Author: licaibiao
    Date:   2017-12-06
    *************************************************/
    static int FindStartCode3 (unsigned char *Buf)  
    {  
    	if(Buf[0]!=0 || Buf[1]!=0 || Buf[2] !=0 || Buf[3] !=1) 
    	{
    		return 0;
    	}
    	else
    	{
    		return 1;  
    	}	
    } 
    
    int read_data(FILE *p_fd,unsigned char* pBuf,int* ps32Len)
    {
    	int l_s32Pos = 0;
    	int l_s32Rewind = -4;
    	int l_s32NaluLen = 0;
    	unsigned char l_u8FindFlag = 0;
    	unsigned char *l_pBuf = NULL;
    	l_pBuf = (unsigned char*)malloc (1024*1024*10);
    	
    	/**从码流中读取4个字节**/
    	if (4 != fread (l_pBuf, 1, 4, p_fd))
    	{  
    		free(l_pBuf);  
    		return -1;  
    	} 
    	
    	/**判断是否是00 00 00 01**/
    	if(FindStartCode3(l_pBuf))
    	{
    		l_u8FindFlag = 1;
    		l_s32Pos = 4;
    	}
    	else
    	{
    		l_u8FindFlag = 0;
    		printf("【[%s:%d] start code error  \n", __func__, __LINE__);
    		return -1;
    	}
    	
    	/**查找下一个开始字符标志位**/
    	l_u8FindFlag = 0;
    	while(!l_u8FindFlag)
    	{
    		/**判断是否到了文件尾**/
    		if(feof(p_fd))
    		{
    			l_s32NaluLen = l_s32Pos - 1;
    			memcpy (pBuf, l_pBuf, l_s32NaluLen);
    			free(pBuf);
    			pBuf = NULL;
    			*ps32Len = l_s32NaluLen;
    			return -2;
    		}
    		/**读取一个字节到pBuf 中**/
    		l_pBuf[l_s32Pos++] = fgetc(p_fd);
    		if(FindStartCode3(&l_pBuf[l_s32Pos-4]))
    		{
    			l_u8FindFlag = 1;
    		}
    	}
    	
    		/**把文件指针指向前一个NALU的末尾 **/
    	if (0 != fseek (p_fd, l_s32Rewind, SEEK_CUR))
    	{  
    		free(l_pBuf);  
    		printf("【[%s:%d] GetAnnexbNALU: Cannot fseek in the bit stream file  \n", __func__, __LINE__);
    	} 
    
    	l_s32NaluLen = l_s32Pos + l_s32Rewind;
    	memcpy(pBuf,l_pBuf,l_s32NaluLen);
    	*ps32Len = l_s32NaluLen;
    	
    	return 0;
    }
    
    int main()
    {
    	unsigned char *l_pBuf = NULL;
    	unsigned char *l_pTemp = NULL;
    	unsigned char *l_pIFrame = NULL;
    	unsigned char *l_pPFrame = NULL;
    	unsigned char* l_IPack[30];
    	unsigned char* l_PPack[30];
    	unsigned int l_ILen[33] = {0};
    	unsigned int l_PLen[33] = {0};
    	unsigned int i =0;
    	unsigned int j =0;
    	unsigned int p =0;
    	unsigned int l_s32ILen = 0;
    	unsigned int l_s32PLen = 0;
    	unsigned int l_d = 0;
    	int l_s32Ret = 0;
    	int l_s32Len = 0;
    	
    	FILE *l_fpInput = NULL;
    	FILE *l_fpOutput = NULL;
    
        printf("biao debug %d \n",__LINE__);
    	l_fpInput = fopen("./001.264","rb");
    	if(NULL==l_fpInput)
    	{
    		printf("open error \n");
    		return -1;
    	}
    	
    	l_fpOutput = fopen("./002.h264","w+");
    	if(NULL==l_fpOutput)
    	{
    		printf("open error \n");
    		return -1;
    	}
    	printf("biao debug %d \n",__LINE__);
    	l_pBuf = (unsigned char*)malloc (1024*1024*1);
    	l_pTemp = (unsigned char*)malloc (1024*1024*1);
    	l_pIFrame = (unsigned char*)malloc (1024*1024*1);
    	l_pPFrame = (unsigned char*)malloc (1024*1024*1);
    	
    	for(i=0;i<33;i++)
    	{
    		l_IPack[i] = (unsigned char*)malloc (500*1024);
    		l_PPack[i] = (unsigned char*)malloc (500*1024);	
    	}
    	i = 0;
    
    	p = 14;
    	while(1)
    	{
    		l_s32Ret = read_data(l_fpInput,l_pBuf,&l_s32Len);
    		if(0==l_s32Ret)
    		{			
    			if(0x61!=l_pBuf[4]) /**I**/
    			{
    				memcpy(&l_pIFrame[l_s32ILen],l_pBuf,l_s32Len);
    				l_s32ILen +=l_s32Len;
    				if(0x65==l_pBuf[4])
    				{
    					printf("write I %d\n",i);
    					memcpy(l_IPack[i],l_pIFrame,l_s32ILen);
    					l_ILen[i] = l_s32ILen;
    					i++;
    					l_s32ILen = 0;
    				}
    			}
    
    			if(0x61==l_pBuf[4]) /**P**/
    			{
    				memcpy(&l_pPFrame[l_s32PLen],l_pBuf,l_s32Len);
    				l_s32PLen +=l_s32Len;
    				p++;
    				if(0==(p%44))
    				{
    					printf("write P %d frame=%d l_s32PLen = %d\n",j,p,l_s32PLen);
    					memcpy(l_PPack[j],l_pPFrame,l_s32PLen);
    					l_PLen[j] = l_s32PLen;
    					j++;
    					l_s32PLen = 0;
    				}
    			}
    			
    		}else
    		{
    			break;
    		}
    	}
    	
    	for(i=0;i<j;i++)
    	{
    		fwrite(l_IPack[i+3],1,l_ILen[i+3],l_fpOutput);
    		fwrite(l_PPack[i],1,l_PLen[i],l_fpOutput);	
    	}
    	fclose(l_fpInput);
    	fclose(l_fpOutput);
    
    	free(l_pBuf);
    	free(l_pTemp);
    	free(l_pIFrame);
    	free(l_pPFrame);
    	for(i=0;i<33;i++)
    	{
    		free(l_IPack[i]);
    		free(l_PPack[i]);
    	}
    	return 0;
    }
    
    

    (八)获取本地IP地址

        在linux设备中获取本地IP地址可以使用下面的程序,支持最大主机有三个网口的设备,当然这个网卡数可以修改。

    #include <stdio.h>
    #include <ifaddrs.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <arpa/inet.h>
    
    int get_local_ip(char *ps8IpList)
    {
        struct ifaddrs *ifAddrStruct;
        char l_s8IpAddr[INET_ADDRSTRLEN];
        void *tmpAddrPtr;
        int l_s32IPCount = 0;
        
        getifaddrs(&ifAddrStruct);
        while (ifAddrStruct != NULL) 
        {
            if (ifAddrStruct->ifa_addr->sa_family==AF_INET)
            {
                tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
                inet_ntop(AF_INET, tmpAddrPtr, l_s8IpAddr, INET_ADDRSTRLEN);
                if (strcmp(l_s8IpAddr, "127.0.0.1") != 0) 
                {
                    if(l_s32IPCount == 0)
                    {
                            memcpy(ps8IpList, l_s8IpAddr, INET_ADDRSTRLEN);
                    } else 
                    {
                            memcpy(ps8IpList+INET_ADDRSTRLEN, l_s8IpAddr, INET_ADDRSTRLEN);
                    }
                    l_s32IPCount++;
                }
            }
            ifAddrStruct=ifAddrStruct->ifa_next;
        }
    
        freeifaddrs(ifAddrStruct);
        return l_s32IPCount;
    }
    
    int main()
    {
        char l_arrs8IpAddrList[3][INET_ADDRSTRLEN];
        int l_s32AddrCount;
        
        memset(l_arrs8IpAddrList, 0, sizeof(l_arrs8IpAddrList));
    
        l_s32AddrCount = get_local_ip(*l_arrs8IpAddrList);
    
        for(l_s32AddrCount;l_s32AddrCount>0;l_s32AddrCount--)
        {
            printf("Server Local IP%d: %s\n",l_s32AddrCount,l_arrs8IpAddrList[l_s32AddrCount-1]);
        }
    	
    	return 0;
    }

     

     

     

     

     

    展开全文
  • 提取码:ymw6关于异或值怎么计算首先使用十六进制器打开微信dat文件,显示如下jpg图片文件头一般为FF D8 开头的,所以此处使用科学计算器,计算异或值计算后的值所以此处异或值就是0x9D代码以下是j...

    前言

    关于异或值怎么计算

    代码

    第二种方式,适合不懂怎么计算,想直接用的代码

    前言

    偶然看到有可以解密微信dat的文档,上网查了查,找到了一篇可以用的文章,不过转换过程代码是有问题的,在这里改了下发布上来。

    提取码:ymw6

    关于异或值怎么计算

    首先使用十六进制器打开微信dat文件,显示如下

    7c7878357e9acea02bc8f0432169f413.png

    jpg图片文件头一般为FF D8 开头的,所以此处使用科学计算器,计算异或值

    7ba3b1d4474c9a39554736c0a539a833.png
    7d9cda42336a0e5a9f4b0ba06ad91300.png

    计算后的值

    ddc2c01c5c09fe640b919876851e0162.png

    所以此处异或值就是0x9D

    代码

    以下是java代码,创建一个weChatImgRevert .java后复制进去就好啦。

    此处的jdk版本需要1.8以上…,另外三个参数需要改成自己的哦~

    package main.java.com.example.demo;import java.io.*;import java.util.Arrays;import java.util.HashMap;import java.util.Map;import java.util.concurrent.atomic.AtomicReference;public class weChatImgRevert {    public static void main(String[] args) {        String path = "C:甥敳獲AdministratorDocumentsWeChat FilesxxxFileStorageImage2019-07";        String targetPath = "D:weChat2019-07";        int xor = 0xCB;        convert(path, targetPath, xor);    }    /**     * @param path       图片地址     * @param targetPath 转换后目录     */    private static void convert(String path, String targetPath, int xor) {        File[] file = new File(path).listFiles();        if (file == null) {            return;        }        int size = file.length;        System.out.println("总共" + size + "个文件");        AtomicReference integer = new AtomicReference<>(0);        Arrays.stream(file).parallel().forEach(file1 -> {            try (InputStream reader = new FileInputStream(file1);                 OutputStream writer =                         new FileOutputStream(targetPath + file1.getName().split(".")[0] + ".jpg")) {                byte[] bytes = new byte[1024 * 10];                int b;                while ((b = reader.read(bytes)) != -1) {//这里的in.read(bytes);就是把输入流中的东西,写入到内存中(bytes)。                    for (int i = 0; i < bytes.length; i++) {                        bytes[i] = (byte) (int) (bytes[i] ^ xor);                        if (i == (b - 1)) {                            break;                        }                    }                    writer.write(bytes, 0, b);                    writer.flush();                }                integer.set(integer.get() + 1);                System.out.println(file1.getName() + "(大小:" + ((double) file1.length() / 1000) + "kb),进度:" + integer.get() +                        "/" + size);            } catch (Exception e) {                e.printStackTrace();            }        });        System.out.println("解析完毕!");    }    /**     * 获取异或值,不一定准确,当解析不出来的时候,换一张图片的异或值来解析     *     * @param PhotoPath     * @return     */    private static int getXor(String PhotoPath) {        File file = new File(PhotoPath);        try (InputStream reader = new FileInputStream(file)) {            int[] xors = new int[4];            xors[0] = reader.read() & 0xFF ^ 0xFF;            xors[1] = reader.read() & 0xFF ^ 0xD8;            reader.skip(file.length() - 1);            xors[2] = reader.read() & 0xFF ^ 0xFF;            xors[3] = reader.read() & 0xFF ^ 0xD9;            Map map = new HashMap<>();            for (int xor : xors) {                if (map.containsKey(xor)) {                    map.put(xor, map.get(xor) + 1);                } else {                    map.put(xor, 1);                }            }            return map.values().stream().max(Integer::compareTo).get();        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }}

    执行main方法后就可以在目标文件夹中去看转换后的图片了
    以下是转换后的效果图片:

    65ddc5ee878fbfa2bb6b4417e0fb7501.png

    第二种方式,适合不懂怎么计算,想直接用的代码

    以下是java代码,创建一个WxChatImgRevert.java后复制进去就好啦。

    此处的jdk版本需要1.8以上…,另外两个参数需要改成自己的哦~

    此处的原理是判断图片文件的十六进制特征码。

    package main.java.com.example.demo;import java.io.*;import java.util.Arrays;import java.util.HashMap;import java.util.Map;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;public class WxChatImgRevert2 {    public static void main(String[] args) {        String path = "C:甥敳獲AdministratorDocumentsWeChat FilesxxxFileStorage";        String targetPath = "D:weChatemp";        convert(path, targetPath);    }    /**     * @param path       图片目录地址     * @param targetPath 转换后目录     */    private static void convert(String path, String targetPath) {        File[] file = new File(path).listFiles();        if (file == null) {            return;        }        int size = file.length;        System.out.println("总共" + size + "个文件");        AtomicReference integer = new AtomicReference<>(0);        AtomicInteger x = new AtomicInteger();        for (File file1 : file) {            if (file1.isFile()) {                Object[] xori = getXor(file1);                if (xori != null && xori[1] != null){                    x.set((int)xori[1]);                }                break;            }        }        Arrays.stream(file).parallel().forEach(file1 -> {            if (file1.isDirectory()) {                String[] newTargetPath = file1.getPath().split("/|");                File targetFile = new File(targetPath+File.separator+newTargetPath[newTargetPath.length - 1]);                if (!targetFile.exists()) {                    targetFile.mkdirs();                }                convert(file1.getPath(),targetPath+File.separator+newTargetPath[newTargetPath.length - 1]);                return;            }            Object[] xor = getXor(file1);            if (x.get() == 0 && xor[1] != null && (int) xor[1] != 0) {                x.set((int) xor[1]);            }            xor[1] = xor[1] == null ? x.get() : xor[1];            try (InputStream reader = new FileInputStream(file1);                 OutputStream writer =                         new FileOutputStream(targetPath + File.separator + file1.getName().split(".")[0] + (xor[0] != null ?                                 "." + xor[0] : ""))) {                byte[] bytes = new byte[1024 * 10];                int b;                while ((b = reader.read(bytes)) != -1) {//这里的in.read(bytes);就是把输入流中的东西,写入到内存中(bytes)。                    for (int i = 0; i < bytes.length; i++) {                        bytes[i] = (byte) (int) (bytes[i] ^ (int) xor[1]);                        if (i == (b - 1)) {                            break;                        }                    }                    writer.write(bytes, 0, b);                    writer.flush();                }                integer.set(integer.get() + 1);                System.out.println(file1.getName() + "(大小:" + ((double) file1.length() / 1000) + "kb,异或值:" + xor[1] + ")," +                        "进度:" + integer.get() +                        "/" + size);            } catch (Exception e) {                e.printStackTrace();            }        });        System.out.println("解析完毕!");    }    /**     * 判断图片异或值     *     * @param file     * @return     */    private static Object[] getXor(File file) {        Object[] xor = null;        if (file != null) {            byte[] bytes = new byte[4];            try (InputStream reader = new FileInputStream(file)) {                reader.read(bytes, 0, bytes.length);            } catch (Exception e) {                e.printStackTrace();            }            xor = getXor(bytes);        }        return xor;    }    /**     * @param bytes     * @return     */    private static Object[] getXor(byte[] bytes) {        Object[] xorType = new Object[2];        int[] xors = new int[3];        for (Map.Entry type : FILE_TYPE_MAP.entrySet()) {            String[] hex = {                    String.valueOf(type.getKey().charAt(0)) + type.getKey().charAt(1),                    String.valueOf(type.getKey().charAt(2)) + type.getKey().charAt(3),                    String.valueOf(type.getKey().charAt(4)) + type.getKey().charAt(5)            };            xors[0] = bytes[0] & 0xFF ^ Integer.parseInt(hex[0], 16);            xors[1] = bytes[1] & 0xFF ^ Integer.parseInt(hex[1], 16);            xors[2] = bytes[2] & 0xFF ^ Integer.parseInt(hex[2], 16);            if (xors[0] == xors[1] && xors[1] == xors[2]) {                xorType[0] = type.getValue();                xorType[1] = xors[0];                break;            }        }        return xorType;    }    private final static Map FILE_TYPE_MAP = new HashMap();    static {        getAllFileType();    }    private static void getAllFileType() {        FILE_TYPE_MAP.put("ffd8ffe000104a464946", "jpg"); //JPEG (jpg)        FILE_TYPE_MAP.put("89504e470d0a1a0a0000", "png"); //PNG (png)        FILE_TYPE_MAP.put("47494638396126026f01", "gif"); //GIF (gif)        FILE_TYPE_MAP.put("49492a00227105008037", "tif"); //TIFF (tif)        FILE_TYPE_MAP.put("424d228c010000000000", "bmp"); //16色位图(bmp)        FILE_TYPE_MAP.put("424d8240090000000000", "bmp"); //24位位图(bmp)        FILE_TYPE_MAP.put("424d8e1b030000000000", "bmp"); //256色位图(bmp)        FILE_TYPE_MAP.put("41433130313500000000", "dwg"); //CAD (dwg)        FILE_TYPE_MAP.put("3c21444f435459504520", "html"); //HTML (html)        FILE_TYPE_MAP.put("3c21646f637479706520", "htm"); //HTM (htm)        FILE_TYPE_MAP.put("48544d4c207b0d0a0942", "css"); //css        FILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); //js        FILE_TYPE_MAP.put("7b5c727466315c616e73", "rtf"); //Rich Text Format (rtf)        FILE_TYPE_MAP.put("38425053000100000000", "psd"); //Photoshop (psd)        FILE_TYPE_MAP.put("46726f6d3a203d3f6762", "eml"); //Email [Outlook Express 6] (eml)        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "doc"); //MS Excel 注意:word、msi 和 excel的文件头一样        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "vsd"); //Visio 绘图        FILE_TYPE_MAP.put("5374616E64617264204A", "mdb"); //MS Access (mdb)        FILE_TYPE_MAP.put("252150532D41646F6265", "ps");        FILE_TYPE_MAP.put("255044462d312e360d25", "pdf"); //Adobe Acrobat (pdf)        FILE_TYPE_MAP.put("2e524d46000000120001", "rmvb"); //rmvb/rm相同        FILE_TYPE_MAP.put("464c5601050000000900", "flv"); //flv与f4v相同        FILE_TYPE_MAP.put("00000020667479706973", "mp4");        FILE_TYPE_MAP.put("49443303000000000f76", "mp3");        FILE_TYPE_MAP.put("000001ba210001000180", "mpg"); //        FILE_TYPE_MAP.put("3026b2758e66cf11a6d9", "wmv"); //wmv与asf相同        FILE_TYPE_MAP.put("524946464694c9015741", "wav"); //Wave (wav)        FILE_TYPE_MAP.put("52494646d07d60074156", "avi");        FILE_TYPE_MAP.put("4d546864000000060001", "mid"); //MIDI (mid)        FILE_TYPE_MAP.put("504b0304140000000800", "zip");        FILE_TYPE_MAP.put("526172211a0700cf9073", "rar");        FILE_TYPE_MAP.put("235468697320636f6e66", "ini");        FILE_TYPE_MAP.put("504b03040a0000000000", "jar");        FILE_TYPE_MAP.put("4d5a9000030000000400", "exe");//可执行文件        FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");//jsp文件        FILE_TYPE_MAP.put("4d616e69666573742d56", "mf");//MF文件        FILE_TYPE_MAP.put("3c3f786d6c2076657273", "xml");//xml文件        FILE_TYPE_MAP.put("efbbbf2f2a0d0a53514c", "sql");//xml文件        FILE_TYPE_MAP.put("7061636b616765207765", "java");//java文件        FILE_TYPE_MAP.put("406563686f206f66660d", "bat");//bat文件        FILE_TYPE_MAP.put("1f8b0800000000000000", "gz");//gz文件        FILE_TYPE_MAP.put("6c6f67346a2e726f6f74", "properties");//bat文件        FILE_TYPE_MAP.put("cafebabe0000002e0041", "class");//bat文件        FILE_TYPE_MAP.put("49545346030000006000", "chm");//bat文件        FILE_TYPE_MAP.put("04000000010000001300", "mxp");//bat文件        FILE_TYPE_MAP.put("504b0304140006000800", "docx");//docx文件        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "wps");//WPS文字wps、表格et、演示dps都是一样的        FILE_TYPE_MAP.put("6431303a637265617465", "torrent");        FILE_TYPE_MAP.put("494d4b48010100000200", "264");        FILE_TYPE_MAP.put("6D6F6F76", "mov"); //Quicktime (mov)        FILE_TYPE_MAP.put("FF575043", "wpd"); //WordPerfect (wpd)        FILE_TYPE_MAP.put("CFAD12FEC5FD746F", "dbx"); //Outlook Express (dbx)        FILE_TYPE_MAP.put("2142444E", "pst"); //Outlook (pst)        FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); //Quicken (qdf)        FILE_TYPE_MAP.put("E3828596", "pwl"); //Windows Password (pwl)        FILE_TYPE_MAP.put("2E7261FD", "ram"); //Real Audio (ram)    }}

    简要介绍下小工具:
    打开小工具后的页面是这样子的,如果没有安装jdk8的话,可以在这里下载安装,不然是运行不了的

    dc6f6f11da085aafb70c37a63d976514.png

    微信的数据存储地址一般是:C:甥敳獲AdministratorDocumentsWeChat Filesxxx

    可以整个扔进去,但是要注意,输出地址一定不能和存储地址相同,最好不要在同一个文件夹里面!!!

    本质上,第一个是读取操作,第二个是写入操作,读取并不会破坏原文件,但是写入如果是同一个文件夹,并且存在同名文件,会被覆盖掉。转换后就是在你指定的输出目录里面

    b481f14e12ca0ef8d299e5b846e342c6.png

    s:小工具是花了一晚上随手写的,楼主估计都找不到源码在哪里了,所以将就着用吧。

    展开全文
  • 支持十六进制查看,JPEG无损旋转,可以调整亮度、对比度及去红眼等。启动软件后,会自动在鼠标右键菜单中添加图片预览功能,完全可以取代ACDSEE看图软件。图片打开速度快且不占用系统资源,可以自定更换皮肤。
  • var x_ch = x.toString(16) //转十六进制 var y_ch = y.toString(16) //转十六进制 var img=new Image() img.src="/seismis/images/map/L0"+zm+"/R00000"+ y_ch+"/C00000"+ x_ch+".png"; if(img....
  • var x_ch = x.toString(16) //转十六进制 var y_ch = y.toString(16) //转十六进制 var img=new Image() img.src="/seismis/images/map/L0"+zm+"/R00000"+ y_ch+"/C00000"+ x_ch+".png"; ...
  • XnView是一款专业好用图片浏览器,支持150种图片格式, 除一般的查看、浏览、幻灯显示等功能外,还自带30多面滤镜,方便编辑修改,还增强了包括浏览器、幻灯片、屏幕捕捉、缩略图制作、批处理转换、十六进制浏览、...
  • XnViewMP是一款专业好用图片浏览器,是著名的免费看图软件XnView的增强新版本软件,其中MP是Multi Platform的缩写,软件不但具有XnView原本的功能,还增强了包括浏览器、幻灯片、屏幕捕捉、缩略图制作、批处理转换、...
  • 易语言模块大全汇总批量下载

    热门讨论 2009-12-15 17:35:39
    易语言~模块~批量~下载 2008-11-08 14:41 文件夹 文件夹 易语言模块大全 2005-10-21 15:30 14489 3100 易语言模块大全\24位单色位图模块.ec 2007-01-18 07:00 7110 2339 易语言模块大全\69msn.ec 2005-05-26 02:18...
  • XnView V2.x Keygen

    2016-11-11 23:57:12
    此外,XnView还具有浏览器、幻灯片、屏幕捕捉、缩略图制作、批处理转换、十六进制浏览、拖放、通讯录、扫描输入等功能。该软件支持43种语言,并能够在Linux/FreeBSD/Irix/Solaris/HP-UX/AIX等操作系统中使用。 ...
  • Xnview v2.34 注册码

    2016-02-26 23:26:18
    此外,XnView还具有浏览器、幻灯片、屏幕捕捉、缩略图制作、批处理转换、十六进制浏览、拖放、通讯录、扫描输入等功能。该软件支持43种语言,并能够在Linux/FreeBSD/Irix/Solaris/HP-UX/AIX等操作系统中使用。 ...
  • 易语言~模块~批量~下载 2008-11-08 14:41 文件夹 文件夹 易语言模块大全 2005-10-21 15:30 14489 3100 易语言模块大全\24位单色位图模块.ec 2007-01-18 07:00 7110 2339 易语言模块大全\69msn.ec 2005-05-26 02:18...
  • XnView_2.04

    2013-08-27 12:48:26
    此外,XnView还具有浏览器、幻灯片、屏幕捕捉、缩略图制作、批处理转换、十六进制浏览、拖放、通讯录、扫描输入等功能。该软件支持43种语言,并能够在Linux/FreeBSD/Irix/Solaris/HP-UX/AIX等操作系统中使用。 ...
  • 凌云好用剪切板 v15.9

    2019-11-01 02:25:49
    导入EXCEL表格和快速调出窗口,还可以快速填序列号,上网填表格,自动抓取网页文本,快速打开文件夹,批量打开文件夹,快速打开网络地址,小型个人数据管理,数据格式转换,单词字数统计,查看十六进制数据,支持...
  • 易语言540个易模块

    2009-05-02 14:48:40
    十进制转化为十六进制5 十六进制转十进制模块 时间格式化-自由扩展型 世恒通用安装系统文件压缩模块 是否为汉字 输入法操作模块 输入法上屏 鼠标控制 树型框操作类 树型框增强 数据库查找 数据库到超级列表框 ...
  • 十六进制转十进制模块 .ec 十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 取十进制.ec 取句柄对应全路径文件名2.1.ec 取图片尺寸.ec 取声调拼音模块1.0.ec 取姓名.ec 取拼音带...
  • Excel插件--OBS.DLL

    2008-11-27 17:05:52
    2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... ...
  • Excel终极伴侣1.287

    2008-10-24 16:41:04
    2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、...
  • Excel终极伴侣1.286

    2008-10-14 10:56:40
    2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... ...
  • Excel终极伴侣1.291

    2009-03-19 09:01:10
    2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、...
  • Excel终极伴侣1.290

    2009-03-12 14:33:14
    2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... 4、...
  • Excel终极伴侣1.288

    2008-11-26 16:01:36
    2、进制转换:在二进制、八进制、十进制、十六进制之间相互转换。 3、人民币大小写互换:在Excel中,很多时候需要将小写的金额数字转换成大写,而Excel提供的函数转换出来的格式并不符合中国人的习惯,所以... ...
  • 十六进制转十进制模块 .ec 时间格式化-自由扩展型.ec 世恒通用安装系统文件压缩模块.ec 是否为汉字.ec 输入法操作模块.ec 输入法上屏.ec 鼠标控制.ec 树型框操作类.ec 树型框增强.ec 数据库查找.ec 数据库...
  • 790个易模块-3

    2013-01-24 23:08:14
    十六进制转十进制模块 .ec 时间格式化-自由扩展型.ec 世恒通用安装系统文件压缩模块.ec 是否为汉字.ec 输入法操作模块.ec 输入法上屏.ec 鼠标控制.ec 树型框操作类.ec 树型框增强.ec 数据库查找.ec 数据库...
  • 790个易模块打包

    2013-01-24 23:04:23
    十六进制转十进制模块 .ec 时间格式化-自由扩展型.ec 世恒通用安装系统文件压缩模块.ec 是否为汉字.ec 输入法操作模块.ec 输入法上屏.ec 鼠标控制.ec 树型框操作类.ec 树型框增强.ec 数据库查找.ec 数据库...
  • 易语言模块大全

    2018-08-07 13:01:30
    十六进制转十进制模块 .ec 十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 发送消息_全选插入.ec 取CPU特征字.ec 取DOS执行结果.ec 取Excel表名列表模块1.0.ec 取IE...
  • 十六进制转十进制模块 .ec 取系统信息.ec 输入法操作模块.ec 取系统信息v2.1.ec 取系统字体列表1.2.ec 属性夹.ec 是否为汉字.ec 色彩转换_模块.ec 日期设置模块.ec 日期格式规范.ec 日期时间增强.ec 数据源按钮.ec ...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0117 使用IntToHex函数将整数转换为十六进制数 80 0118 使用Int函数返回实数的整数部分 80 0119 使用IntToStr函数将整数转换为字符串类型 80 0120 使用StrToInt函数将字符串转换成整数 81 0121 使用...
  • 易语言模块914个

    2018-03-12 20:00:21
    十六进制转十进制模块 .ec 十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 发送消息_全选插入.ec 取CPU特征字.ec 取DOS执行结果.ec 取Excel表名列表模块1.0.ec 取IE...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

十六进制批量转图片