⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 checksum.c

📁 彩信MMS的全部代码
💻 C
字号:
/*
 * Copyright (C) Obigo AB, 2002-2005.
 * All rights reserved.
 *
 * This software is covered by the license agreement between
 * the end user and Obigo AB, and may be 
 * used and copied only in accordance with the terms of the 
 * said agreement.
 *
 * Obigo AB assumes no responsibility or 
 * liability for any errors or inaccuracies in this software, 
 * or any consequential, incidental or indirect damage arising
 * out of the use of the software.
 *
 */











 





#include "cmnconf.h"    
#include "cansilib.h"   
#include "aapifile.h"   
#include "aapicmn.h"    

#include "cutils.h"     
#include "checksum.h"   


#define CHKSUM_LEN    3
#define CFIL_BUFF_LEN 256
























UINT8 chksumCalc8(void *buf, INT32 len)
{
    UINT8 chksum = 0;
    unsigned char *p = buf;

    while (p != NULL && len-- > 0)
    {
        chksum = (UINT8)(chksum + (UINT8)*p++);
    } 

    return (UINT8)(chksum ^ 0xFF);
} 






UINT32 chksumCalc32(void *buf, UINT32 len)
{
    UINT32 chksum = 0;
    unsigned char *p = buf;

    while (p != NULL && len-- > 0)
    {
        chksum += (UINT32)*p++;
    } 

    return chksum ^ 0xFFFFFFFF;
} 






int cfilCalculateChecksum(UINT32 fileId, INT32 len, char category)
{
    unsigned char chksum = 0;
    CMN_BOOL  done = FALSE;
    char  buff[CFIL_BUFF_LEN];
    INT32 pos = 0;
    INT32 bytesRead;
    
    
    while (!done)
    {
        bytesRead = FILEa_read( category, fileId, buff, pos, CFIL_BUFF_LEN);
        if (bytesRead == -1)
        {
            return -1;
        }
        else
        {
            chksum = (unsigned char)(chksum + chksumCalc8( buff, bytesRead));
            
            pos += bytesRead;
            if (pos >= len)
            {
                done = TRUE;
            } 
        } 
    } 
    
    return (int)chksum;
}




CMN_BOOL cfilStoreCheckSum(UINT32 fileId, CMN_BOOL fileOpen, char category)
{
    INT32 fileLen;
    INT32 bytesWritten;
    int   checkSum;
    char  checkSumStr[CHKSUM_LEN + 1]; 
    
    if (!fileOpen && -1 == FILEa_open(category, fileId, 
        FILE_OPTION_READ | FILE_OPTION_WRITE))
    {
        return FALSE;
    }
    
    if (-1 == (fileLen = FILEa_getSize(category, fileId)))
    {
        if (!fileOpen)
        {
            FILEa_close(category, fileId);
        }
        return FALSE;
    }
    
    if ( fileLen == 0)
    {
        
        if (!fileOpen)
        {
            FILEa_close(category, fileId);
        } 
        return TRUE;
    } 
    
    if (-1 == (checkSum = cfilCalculateChecksum(fileId, fileLen, category)))
    {
        if (!fileOpen)
        {
            FILEa_close (category, fileId);
        }
        return FALSE;
    }
    
    sprintf(checkSumStr, "%3.3d", checkSum);
    bytesWritten = FILEa_write(category, fileId, checkSumStr, fileLen, CHKSUM_LEN);
        
    if (!fileOpen)
    {
        FILEa_close(category, fileId);
    }
    
    if (bytesWritten != CHKSUM_LEN)
    {
        return FALSE;
    }
    
    return TRUE;
}




CMN_BOOL cfilVerifyCheckSum(UINT32 fileId, CMN_BOOL fileOpen, char category)
{
    INT32           fileLen;
    INT32           bytesRead;
    char            checkSumFromFile[CHKSUM_LEN + 1];
    int             checkSum;
    CMN_BOOL        bResult = FALSE;
    
    if (!fileOpen && -1 == FILEa_open (category, fileId, 
        FILE_OPTION_READ | FILE_OPTION_WRITE))
    {
        return FALSE;
    }
    
    if (-1 == (fileLen = FILEa_getSize(category, fileId)) || 
        fileLen < CHKSUM_LEN)
    {
        return FALSE;
    }
    
    
    bytesRead = FILEa_read(category, fileId, checkSumFromFile, 
        fileLen - CHKSUM_LEN, CHKSUM_LEN);
    
    checkSumFromFile[CHKSUM_LEN] = '\0';
    if (bytesRead != CHKSUM_LEN)
    {
    }
    else if (!cmnIsDigits(checkSumFromFile))
    {
    }
    else if (-1 == (checkSum = cfilCalculateChecksum(fileId, 
        fileLen - CHKSUM_LEN, category)))
    {
    }
    else if (atoi(checkSumFromFile) == checkSum)
    {
        bResult = TRUE;
    }
    
    if (!fileOpen)
    {
        FILEa_close (category, fileId);
    }
    
    return bResult;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -