快速提取PUZZLE & DRAGONS音效的方法

首先声明,本人是P&D脑残粉,有关P&D的一切东西都想得到-_-#

好了,下面开始搞定今天要做的事:

首先我们假设游戏的音效一定在ipa里。进入默认目录“/Users/#userName#/Music/iTunes/iTunes Media/Mobile Applications”找到“P&D 5.1.2.ipa”;


用任意一种方法解压缩这个文件,进入这里-> "/P&D 5.1.2/Payload";


open it-


然后我们继续假设*.caf是音乐文件,DATA003.BIN是音效文件。(你够- -)


看见没有,这么多RIFF说明了什么?我的假设是不证自明的~!(路人:拍死它!)

根据目前所知的信息,我们可以开始编程了。为了节约时间,我选择用C语言写代码。

//
//  main.c
//  各种C代码测试
//
//  Created by FIREDOM on 4/22/13.
//  Copyright (c) 2013 firedom. All rights reserved.
//

#include "Header.h"

int numaddition(char *numArray)
{
    int temp = 0;
    temp = atoi(numArray);
    temp++;
    sprintf(numArray, "%d", temp);
    return (0);
}

int compare(unsigned char *leftArray, unsigned char *rightArray, int lengh)
{
    for(int i = 0; i < lengh ; i++)
    {
        if(leftArray[i] != rightArray[i])
        {
            return (0);
        }
    }
    return (1);
}

int makeFile(FILE *fp, unsigned char *fileKey, char *fileNum)
{
    char final_leftName[20] = "DATA003-";
    char rightName[] = ".wav";
    strcat(final_leftName, fileNum);
    strcat(final_leftName, rightName);
    FILE *fp2;
    fp2 = fopen(final_leftName, "wb");
    if(fp2 == NULL)
    {
        puts("open 1 failed.");
        return  (-1);
    }
    int counter = 2;
    unsigned char temp[4] = {0x0};
    //
    while(1)
    {
        fread(temp, 4, 1, fp);
        if(counter)
        {
            if(feof(fp))
            {
                return (-1);
            }
            if(compare(fileKey, temp, 4))
            {
                counter = counter - 1;
                if(counter == 0)
                {
                    return (0);
                }
            }
            fwrite(temp, 4, 1, fp2);
        }
        if(counter == 0)
        {
            return (0);
        }
    }
    //
    
    if(fclose(fp2))
    {
        puts("close failed.");
        return (-1);
    }
    return (0);
}


int main(int argc, const char * argv[])
{
    FILE *fp1;
    fp1 = fopen("DATA003.BIN", "rb");
    char fileNum[4] = "000";
    if(fp1 == NULL)
    {
        puts("open failed.");
        return  (-1);
    }
//
    unsigned char buff[4] = {0x0};
    fread(buff, 4, 1, fp1);
    fseek(fp1, 0L, SEEK_SET);
    while(1)
    {
        numaddition(fileNum);
        if(makeFile(fp1, buff, fileNum))
        {
            break;
        }
        else
        {
            fseek(fp1, -4L, SEEK_CUR);
        }
        
    }
//
    if(fclose(fp1))
    {
        puts("close failed.");
        return (-1);
    }

    return 0;
}

现在出现在您眼前的是一句注释都没有的代码。在加上注释之前本人要出门吃烤肉去,稍后回来-_-#

#include "Header.h"

int numaddition(char *numArray)
{
    int temp = 0;
    temp = atoi(numArray);
    temp++;
    sprintf(numArray, "%d", temp);
    return (0);
}

int compare(unsigned char *leftArray, unsigned char *rightArray, int lengh)
{
    for(int i = 0; i < lengh ; i++)
    {
        if(leftArray[i] != rightArray[i])
        {
            return (0);
        }
    }
    return (1);
}

int makeFile(FILE *fp, unsigned char *fileKey, char *fileNum)
{
    char final_leftName[20] = "DATA003-";
    char rightName[] = ".wav";
    strcat(final_leftName, fileNum);
    strcat(final_leftName, rightName);
    FILE *fp2;
    fp2 = fopen(final_leftName, "wb");
    if(fp2 == NULL)
    {
        puts("open 1 failed.");
        return  (-1);
    }
    int counter = 2; // 计数器,当=0时停止复制。
    unsigned char temp[4] = {0x0};
    //
    while(1)
    {
        fread(temp, 4, 1, fp);
        if(counter)
        {
            if(feof(fp))
            {
                return (-1);
            }
            if(compare(fileKey, temp, 4)) // 寻找下一个文件的文件头
            {
                counter = counter - 1;
                if(counter == 0)
                {
                    return (0);
                }
            }
            fwrite(temp, 4, 1, fp2);
        }
        if(counter == 0)
        {
            return (0);
        }
    }
    //
    if(fclose(fp2))
    {
        puts("close failed.");
        return (-1);
    }
    return (0);
}


int main(int argc, const char * argv[])
{
    FILE *fp1;
    fp1 = fopen("DATA003.BIN", "rb");
    char fileNum[4] = "000";
    if(fp1 == NULL)
    {
        puts("open failed.");
        return  (-1);
    }
//
    unsigned char buff[4] = {0x0}; // 读取文件头
    fread(buff, 4, 1, fp1);
    fseek(fp1, 0L, SEEK_SET); 
    while(1)
    {
        numaddition(fileNum); // 设置文件编号
        if(makeFile(fp1, buff, fileNum)) // 创建声音文件
        {
            break;
        }
        else
        {
            fseek(fp1, -4L, SEEK_CUR); // 偏移量调整
        }
    }
//
    if(fclose(fp1))
    {
        puts("close failed.");
        return (-1);
    }
    return (0);
}
过程就是这样。OK,下面是程序和导出的音效。
点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值