zoukankan      html  css  js  c++  java
  • calculate MAC,Lisence,Checksum and generate muti-file

    /*************************************************************************
     *    calculate MAC,Lisence,Checksum and generate muti-file
     * 声明:
     *  1. 以升序的方式批量生成MAC地址方法;
     *  2. 以升序、降序的方式批量生成数字形式的Lisence方法;
     *  3. 以累加的方式计算MAC地址、Lisence的Checksum;
     *  4. 不提供源数据处理文件,仅仅是处理数据代码;
     *  5. 本软件主要是为后续软件开发提供更好的解决数据处理的方式。
     *  6. 本人并没有对代码进行优化,主要是考虑到保留编写代码过程中的一些细节。
     *
     *                                   2015-8-24 晴 深圳 南山平山村 曾剑锋
     ************************************************************************/
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define debug 
    
    #ifdef debug
        #define Debug(...) fprintf(stdout,"debug: " __VA_ARGS__);
    #else 
        #define Debug(...)
    #endif
    
    int  htoi( char s[] );
    int  createDir( const char *sPathName );
    int  changeLisenceByte( char * lisenceByte, int number );
    void calculateNextMacAddress( int mac[], int i );
    void calculateNextLisence( char lisence[], int i );
    
    int main ( int argc, char ** argv ) {
    
        int  i               = 0;
        int  ret             = 0;
        int  count           = 0;
        int  mac[6]          = {0};
        char lisence[18]     = {0};
        FILE *mtd5OutFile    = NULL;
        FILE *mtd6OutFile    = NULL;
        char readBuffer[512] = {0};
    
        if ( argc != 4 ) {                                    // check arguments number
            printf ( " USAGE:
    " );
            printf ( "     macLis <mac> <lisence> <count>
    " );
            printf ( "     example:
    " );
            printf ( "         macLis 11:22:33:44:55:66 20150609622300214 10   
    " );
            return -1;
        }
    
        printf ( "mac : %s
    ", argv[1] );
        printf ( "lisence : %s
    ", argv[2] );
        printf ( "count : %s
    ", argv[3] );
    
        for ( i = 0; i < 6; i++ ) {
            argv[1][ ( i + 1 ) * 3 - 1] = '';                // change ':' to '' 
            mac[i] = htoi ( argv[1] + ( i * 3 ) );
        }
        Debug ( "mac : %2x:%2x:%2x:%2x:%2x:%2x
    ", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] );
    
        memcpy ( lisence, argv[2], sizeof(lisence) - 1 );
        Debug ( "lisence : %s
    ", lisence );
    
        count = atoi ( argv[3] );                            // how many diretory to generate
        Debug ( "count : %d
    ", count);
    
        FILE *mtd5SourceFile = fopen ( "temp5", "rb" );        // open input file with binary
        FILE *mtd6SourceFile = fopen ( "temp6", "rb" );
    
        char dirPath[10]              = {0};
        char outMtd5FilePath[20]      = {0};
        char outMtd6FilePath[20]      = {0};
        char macString[12]            = {0};
        long sum                      = 0;
    
        for ( i = 0; i < count ; i++ ) {
    
            sprintf ( dirPath, "%03d", i );                    // generator diretory
            sprintf ( outMtd5FilePath, "%03d/temp5", i );   // generator temp5 file
            sprintf ( outMtd6FilePath, "%03d/temp6", i );   // generator temp6 file
    
            createDir( dirPath );
            mtd5OutFile = fopen ( outMtd5FilePath, "w+b" );    // open output file with binary
            mtd6OutFile = fopen ( outMtd6FilePath, "w+b" );
    
            rewind ( mtd5SourceFile );                        // go head
            rewind ( mtd6SourceFile );
    
            // copy file content
            while ( ret = fread ( readBuffer, 1, sizeof(readBuffer), mtd5SourceFile ) ) 
                fwrite ( readBuffer, 1, sizeof(readBuffer), mtd5OutFile );
    
            // copy file content
            while ( ret = fread ( readBuffer, 1, sizeof(readBuffer), mtd6SourceFile ) ) 
                fwrite ( readBuffer, 1, sizeof(readBuffer), mtd6OutFile );
    
            // generate mac string and write to file
            sprintf ( macString, "%c%c%c%c%c%c", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] );
            fseek(mtd5OutFile, (0x670) + 9, SEEK_SET);
            fwrite ( macString, 1, 6, mtd5OutFile );
            fseek(mtd6OutFile, (0x30) + 5, SEEK_SET);
            fwrite ( macString, 1, 6, mtd6OutFile );
    
            // write Lisence number to file
            fseek(mtd5OutFile, (0x680) + 5, SEEK_SET);
            fwrite ( lisence, 1, 17, mtd5OutFile );
            fseek(mtd6OutFile, (0x40) + 1, SEEK_SET);
            fwrite ( lisence, 1, 17, mtd6OutFile );
    
            // clear the data has used 
            bzero ( dirPath, sizeof(dirPath) );
            bzero ( outMtd5FilePath, sizeof(outMtd5FilePath) );
            bzero ( outMtd6FilePath, sizeof(outMtd5FilePath) );
    
            // change MAC address with increase number 1
            calculateNextMacAddress( mac, 1 );
            // change lisence with decrease number 1
            calculateNextLisence( lisence, -1 );
    
    
                /**
                 * go to calculate checksum
                 */
    
                // read check data from file 
                bzero ( readBuffer, sizeof(readBuffer) );
                fseek ( mtd5OutFile, (0x640) + 0x0d, SEEK_SET );
                fread ( readBuffer, 1, 9*16, mtd5OutFile);
    
                // add all data as checksum, be carefull to use unsigned char to keep data was byte
                int j = 0;
                sum = 0;
                for ( j = 0; j < ( 9 * 16 ); j++ ) 
                    sum += ( unsigned char ) readBuffer[j];   // must type change to keep is positive
                char checkSum[20] = {0};
                sprintf ( checkSum, "%04x", sum );
                Debug ( " temp5 checkSum: %s
    ", checkSum );
    
                // write checksum to file
                fseek ( mtd5OutFile, (0x640) + 0x08, SEEK_SET );
                fwrite ( &sum, 1, 4, mtd5OutFile);
                
                bzero ( readBuffer, sizeof(readBuffer) );
                bzero ( checkSum, sizeof(checkSum) );
            
                // work way as above
                fseek ( mtd6OutFile, (0x000) + 0x09, SEEK_SET );
                fread ( readBuffer, 1, 9*16, mtd6OutFile);
    
                sum = 0;
                for ( j = 0; j < ( 9 * 16 ); j++ ) 
                    sum += ( unsigned char ) readBuffer[j];   // must type change to keep is positive
                sprintf ( checkSum, "%04x", sum );
                Debug ( " temp6 checkSum: %s
    ", checkSum );
    
                fseek ( mtd6OutFile, (0x000) + 0x04, SEEK_SET );
                fwrite ( &sum, 1, 4, mtd6OutFile);
                
                bzero ( readBuffer, sizeof(readBuffer) );
    
            // flush to file and close 
            fflush ( mtd5OutFile );        
            fclose ( mtd5OutFile );
    
            fflush ( mtd6OutFile );
            fclose ( mtd6OutFile );
        }
    
        fclose ( mtd5SourceFile );
        fclose ( mtd6SourceFile );
    
        return 0;
    }
    
    int htoi(char s[]) 
    { 
        int i; 
        int n = 0; 
    
        // skip "0x" or "0X"
        if (s[0] == '0' && (s[1]=='x' || s[1]=='X')) { 
            i = 2; 
        } else { 
            i = 0; 
        } 
    
        for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z'); ++i) {   
    
            if (tolower(s[i]) > '9') { 
                n = 16 * n + (10 + tolower(s[i]) - 'a'); 
            } else { 
                n = 16 * n + (tolower(s[i]) - '0'); 
            } 
    
        } 
    
        return n; 
    } 
    
    int createDir(const char *sPathName)  
    {  
        char  DirName[256];  
        int   i;
        int   len = strlen ( DirName );  
    
        strcpy ( DirName,   sPathName );  
    
        if ( DirName[ len-1 ] != '/' )  
            strcat ( DirName,   "/" );  
          
        len = strlen ( DirName );  
          
        for ( i = 1; i < len; i++ ) {  
            if ( DirName[i] == '/' ) {  
                DirName[i] = 0;  
                if( access ( DirName, NULL ) != 0 ) {  
                    if(mkdir(DirName, 0755)==-1) {   
                         perror("mkdir  error");   
                        return -1;   
                    }  
                }  
                DirName[i] = '/';  
            }  
        }  
          
        return   0;  
    }   
    
    /**
     * i: this can only be positive
     */
    void calculateNextMacAddress( int mac[], int i ) {
    
        int macByte5 = ( i + mac[5] ) % 256;
        int macByte4 = ( ( i + mac[5] ) / 256  + mac[4] ) % 256;
        int macByte3 = ( ( ( ( i + mac[5] ) / 256 ) + mac[4] ) / 256  + mac[3] ) % 256;
        int macByte2 = ( ( ( ( ( i + mac[5] ) / 256 ) + mac[4] ) / 256  + mac[3] ) / 256  + mac[2] ) % 256;
        int macByte1 = ( ( ( ( ( ( i + mac[5] ) / 256 ) + mac[4] ) / 256  + mac[3] ) / 256  + mac[2] ) / 256 + mac[1] ) % 256;
        int macByte0 = ( ( ( ( ( ( ( i + mac[5] ) / 256 ) + mac[4] ) / 256  + mac[3] ) / 256  + mac[2] ) / 256 + mac[1] ) / 256 + mac[0] ) % 256;
    
        mac[0] = macByte0;
        mac[1] = macByte1;
        mac[2] = macByte2;
        mac[3] = macByte3;
        mac[4] = macByte4;
        mac[5] = macByte5;
    
        Debug ( "calculate next Mac : %02x:%02x:%02x:%02x:%02x:%02x
    ", macByte0, macByte1, macByte2, macByte3, macByte4, macByte5 );
    }
    
    void calculateNextLisence( char lisence[], int i ) {
        int tmp = 0;
        tmp = changeLisenceByte( &lisence[16], i );
        tmp = changeLisenceByte( &lisence[15], tmp );
        tmp = changeLisenceByte( &lisence[14], tmp );
        tmp = changeLisenceByte( &lisence[13], tmp );
        tmp = changeLisenceByte( &lisence[12], tmp );
        tmp = changeLisenceByte( &lisence[11], tmp );
        tmp = changeLisenceByte( &lisence[10], tmp );
        tmp = changeLisenceByte( &lisence[9], tmp );
        tmp = changeLisenceByte( &lisence[8], tmp );
        tmp = changeLisenceByte( &lisence[7], tmp );
        tmp = changeLisenceByte( &lisence[6], tmp );
        tmp = changeLisenceByte( &lisence[5], tmp );
        tmp = changeLisenceByte( &lisence[4], tmp );
        tmp = changeLisenceByte( &lisence[3], tmp );
        tmp = changeLisenceByte( &lisence[2], tmp );
        tmp = changeLisenceByte( &lisence[1], tmp );
        tmp = changeLisenceByte( &lisence[0], tmp );
        
        Debug ( "calculate next lisence : %s
    ", lisence );
    }
    
    /**
     * number: this can be positive or negative
     */
    int changeLisenceByte( char * lisenceByte, int number ) {
        int tmp = 0;
        if ( ( lisenceByte[0] - 48 ) + number < 0 ) {
            tmp = ( ( lisenceByte[0] - 48 ) + number ) / 10 - 1;
            lisenceByte[0] = ( 10 + ( ( lisenceByte[0] - 48 ) + number ) % 10 ) + 48;
        } else {
            tmp = ( ( lisenceByte[0] - 48 ) + number ) / 10;
            lisenceByte[0] = ( ( lisenceByte[0] - 48 ) + number ) % 10 + 48;
        }
    
        return tmp;
    }
  • 相关阅读:
    console.time测试代码块执行时间
    label表单的关联性
    attr返回被选元素的属性值
    2018 885程序设计编程题
    输出斐波拉数列的前n个数(n>=2)
    简单的光照贴图
    复杂纹理复制及纹理叠加效果
    简单纹理复制
    UV旋转shader
    shader实现积雪效果
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4755697.html
Copyright © 2011-2022 走看看