posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
template<typename T>
T SwapByte(
const T& v)
{
    T res 
= v;
    
char* p = (char*)&res;
    
char* q = (char*)&res+sizeof(T)-1;
    
while(p<q)
    {
        swap(
*p,*q);
        p
++;
        q
--;
    }
    
return res;
}

template
<typename T>
T DoNothing(
const T& v)
{
    
return v;
}

struct PkgNode
{
    
char* m_Filename; //4
    void* m_pData;    //4
    size_t m_Size;    //4
}; // 12

void WritePkg(const char* filename, PkgNode pkgNodes[], int n)
{
    FILE
* fp = fopen(filename, "wb");
    
// offset 0 
    { //写头
        char head[12= "DAISPKG";
        fwrite(head, 
121, fp);
    }
    
// offset 12
    { //写Endian标志
        int endianFlag = 0x12345678;
        fwrite(
&endianFlag, 41, fp);
    }
    
// offset 16
    { //写入文件个数
        fwrite(&n, 41, fp);
    }
    
// offset 20
    { //留白
        int x = 0;
        fwrite( 
&x, sizeof(PkgNode), n, fp);
    }
    
// offset 20 + sizeof(PkgNode) * n
    PkgNode* pkgHeader = (PkgNode*)malloc(sizeof(PkgNode)*n);
    
for(int i=0;i<n;i++)
    {
        pkgHeader[i].m_Filename 
= (char*)ftell(fp);
        fwrite(pkgNodes[i].m_Filename, strlen(pkgNodes[i].m_Filename)
+11, fp);
    }
    
for(int i=0;i<n;i++)
    {
        pkgHeader[i].m_pData 
= (void*)ftell(fp);
        fwrite(pkgNodes[i].m_pData, pkgNodes[i].m_Size, 
1, fp);
        pkgHeader[i].m_Size 
= pkgNodes[i].m_Size;
    }

    fseek(fp, 
20, SEEK_SET);
    fwrite(pkgHeader, 
sizeof(PkgNode)*n, 1, fp);

    free(pkgHeader);
    fclose(fp);
}

void* ReadPkg(const char* filename, PkgNode** pkgNodes, int* n)
{
    FILE
* fp = fopen(filename, "rb");
    fseek(fp, 
0, SEEK_END);
    size_t size 
= ftell(fp);
    fseek(fp, 
0, SEEK_SET);
    
void* pData = malloc(size);
    fread(pData, size, 
1, fp);

    
char head[12= "DAISPKG";
    
if(memcmp(head, pData, 12)==0)
    {
        
int endianFlag = *(int*)((char*)pData + 12);
        
int (*EndianProc)(const int&= NULL;
        
if(endianFlag==0x12345678)
        {
            EndianProc 
= DoNothing<int>;
        }
        
else
        {
            
//endianFlag should be 0x78563412
            EndianProc = SwapByte<int>;
        }
        
int fileNum = EndianProc(*(int*)((char*)pData + 16));
        
*= fileNum;
        
*pkgNodes = (PkgNode*)((char*)pData + 20);
        
for(int i=0;i<fileNum;i++)
        {
            (
*pkgNodes)[i].m_Filename = (char*)(EndianProc((int)((*pkgNodes)[i].m_Filename)) + (int)pData);
            (
*pkgNodes)[i].m_pData = (void*)(EndianProc((int)((*pkgNodes)[i].m_pData)) + (int)pData);
        }
    }
    
else
    {
        free(pData);
        pData 
= NULL;
    }
    fclose(fp);
    
return pData;
}

void ReleasePkg(void* ptr)
{
    free(ptr);
}

Feedback

# oDPwN5 <a href="http://vfqhjymgdjkj.com/">vfqhjymgdjkj</a>  回复  更多评论   

2011-05-22 20:59 by jpbrythb
oDPwN5 <a href="http://vfqhjymgdjkj.com/">vfqhjymgdjkj</a>
只有注册用户登录后才能发表评论。