假如说有一个15位的IMEI码,如何生成mp0b文件,有谁知道算法啊

解决方案 »

  1.   

    bool create_bp0b_001(PTSTR imei1, PTSTR imei2, PTSTR save_file_path)
    {
        unsigned int i = 0;
        TCHAR _IMEI1[16];
        TCHAR _IMEI2[16];    // imei 输入是否有问题
        if (imei1 == NULL || imei2 == NULL)
        {
            return false;
        }    if (_tcslen(imei1) < 14 || _tcslen(imei2) < 14)
        {
            return false;
        }    for (i=0; i<_tcslen(imei1); i++)
        {
            if ( imei1[i]<TEXT('0') || imei1[i]>TEXT('9') )
            {
                return false;
            }
        }    for (i=0; i<_tcslen(imei2); i++)
        {
            if ( imei2[i]<TEXT('0') || imei2[i]>TEXT('9') )
            {
                return false;
            }
        }    // 检测校验位
        _tcsncpy(_IMEI1, imei1, 16);
        if ( !check_imei(_IMEI1) )
        {
            ::MessageBox(NULL, TEXT("IMEI1有错误,已经修正"), TEXT("提示"), MB_OK);
        }    _tcsncpy(_IMEI2, imei2, 16);
        if ( !check_imei(_IMEI2) )
        {
            ::MessageBox(NULL, TEXT("IMEI2有错误,已经修正"), TEXT("提示"), MB_OK);
        }    // 写 BP0B_001 文件
        PBYTE BP0B_buf = new BYTE[0x80];
        if (BP0B_buf == NULL)
        {
            ::MessageBox(NULL, TEXT("alloc buffer error!\n"), TEXT("memory error"), MB_OK);
            return false;
        }
        memset(BP0B_buf, 0, 0x80);
        memcpy(BP0B_buf, table, 0x78);    write_imei(BP0B_buf, _IMEI1);
        write_imei(BP0B_buf+12, _IMEI2);    HANDLE handle = ::CreateFile(save_file_path, 
            GENERIC_READ|GENERIC_WRITE, 
            FILE_SHARE_READ, 
            NULL, 
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
        if (handle == INVALID_HANDLE_VALUE)
        {
            ::MessageBox(NULL, TEXT("File create error"), TEXT("Error"), MB_OK);
            delete []BP0B_buf;
            return false;
        }    DWORD dwBytes = 0;
        ::WriteFile(handle, BP0B_buf, 0x78, &dwBytes, NULL);
        CloseHandle(handle);
        delete []BP0B_buf;
        return true;
    }bool create_mp09_001(char* sn)
    {
        int i=0;    if (strlen(sn) < 18)
        {
            // 必须18位的哦
            return false;
        }
        LPBYTE pbuf = new BYTE[0x42];
        memcpy(pbuf, table2, 0x42);
        for (i=0; i<18; i++)
        {
            pbuf[i] ^= sn[i];
        }    i = 0;
        do 
        {
            pbuf[0x40] += pbuf[i++];
            pbuf[0x41] += pbuf[i++];
        } while (i<0x40);    FILE* fp = fopen("MP09_001", "wb");
        fwrite(pbuf, 1, 0x42, fp);
        fclose(fp);    delete []pbuf;
        return true;
    }