睡梦中吧 关注:38,643贴子:315,422

【技术向】bin文件解析

只看楼主收藏回复

不擅长搞自制谱就搞旁门左道系列
本渣见mrock_song_client_android.bin文件(以下简称bin文件)已经出现很久了,吧里却一直没有人发表关于这个文件的解析,最近心血来潮想搞个修改bin文件的程序却发现我搞不懂这个bin文件然后花了一天的时间研究这个鬼玩意后来才发现原来wom里有个dalao(就是这位>>@Fsu0413 )早就研究清楚了害我费了一天的时间来研究为了不让别人重蹈我找不到资料的覆辙,今天我来把这个坑给填了吧
本解析建立在已经对mrock_song_client_android.xml(以下简称xml文件)有所了解到基础之上,而xml文件的解析已经n多年前就有了
丢几个关于xml文件的帖子:
by睡梦中:http://tieba.baidu.com/p/2698258698
by唐三的幻影号(从6楼开始有关于xml的解析):http://tieba.baidu.com/p/3713628959
由于其中一些数据的功能是我个人研究所得的,与上面的两个帖子可能有些冲突...
乱七八糟的tip:
可能些许纰漏还请dalao指正
本教程建立在对电脑技术有一定了解的基础上
如果有机会的话我可能会把其他几个bin文件也解析一下
最后:
记事本强行打开mrock_song_client_android.bin镇楼


IP属地:四川1楼2017-04-04 10:02回复
    前排提醒只看楼主
    或者各位不要插楼...


    IP属地:四川2楼2017-04-04 10:03
    回复
      备用楼


      IP属地:四川3楼2017-04-04 10:03
      回复
        首先我们需要用正确的方式打开这个文件,我用的是010editor

        比起镇楼图那堆完全看不懂是什么鬼的乱码,现在是一堆看得懂是什么鬼但不明含义的乱码了(误)
        同时我们打开xml文件进行比较

        经我的研究,bin文件中没有使用任何类似于xml文件中的标识来标记储存的信息,而是
        (重点→)使用固定的字节(byte)长度在确定的位置储存对应的信息(←重点)
        也可以理解为:
        使用固定的数据类型(整型,字符等)在确定的位置储存对应的信息


        IP属地:四川4楼2017-04-04 10:06
        回复
          插。
             如果来生太远寄不到诺言,不如学着放下许多执念。


          IP属地:北京来自Android客户端5楼2017-04-04 10:07
          收起回复
            正片开始:
            bin文件前136b(注:b即byte、字节,如果这个都不懂...你可以放弃看本帖了)的内容对应的是xml文件里开头那堆乱七八糟(误)的东西

            其中大部分没什么用,只有一个count值是关键数据,是指bin文件中总的path数,count值位于整个文件第13b到16b

            这里就有一点问题了,此处count值为500,而F401(16)=62465(10)啊?就算F41(16)也解释不通啊???【注:数字后面带的括号里面代表的是所使用的进制】其实很简单,因为这里的数据是倒着排的...也就是说F4 01 00 00要倒过来排成00 00 01 F4(注意F4不用倒成4F)再转成十进制就正常了,图中间的计算器也证明了1F4(16)=500(10)这一点
            而搞编程的盆友们不要担心要去麻烦的准备函数去倒转数据,实际上计算机储存数据就是倒序的...也就是说只要原封不动地把二进制数据复制到变量里就行了...


            IP属地:四川6楼2017-04-04 10:08
            收起回复
              接下来的就是贝多芬病毒的path了

              由于储存同类path信息(如ID、曲名、作者等)在path里的位置是固定的,储存同类path信息的字节长度也是固定的,所以每个path的长度都是固定的,都为830b
              为了方便我把贝多芬病毒的path单独复制出来进行比较


              IP属地:四川7楼2017-04-04 10:11
              回复
                xml我倒是懂不过二进制就不行了


                IP属地:北京来自Android客户端8楼2017-04-04 10:13
                收起回复
                  bin里一个path的前2b,对应的是xml的SongID值,别看只有2b,可以储存65535个ID呢!(见下图)

                  接下来4b(3b-6b)储存的是不明意义的Version值(见下图)
                  (这里再一次证明了里面的数据是倒序排列的)

                  接下来64b(7b-70b)(没错足足64b!!!貌似不算多诶...)储存的是SongName值(即歌曲名)(见下图)

                  这里又有问题了...010editor右边那一栏是显示把数据转换后的文本,而那堆乱码是什么鬼(掀桌),
                  而下面的Path值为什么又好好的就是"beiduofengbingdu"(掀桌x2)
                  很简单...010右栏编译文字用的是ANSI编码(应该没记错吧...),而bin里的应该用UTF-8编码编译...同一个汉字在不同的编码里对应的号码是不一样的,UTF-8里"贝多芬病毒"的编码和ANSI里的不一样,自然就乱码了,改用UTF-8编译文字就正常啦(见下图)

                  至于为什么"beiduofenbingdu"不会变成乱码,是因为基本上所有编码都是基于ASCII编码拓展的,所以ASCII编码里的字符就不会乱码了...(ASCII里包括了大小写英文字母,阿拉伯数字,常见"英文"符号,空格以及回车等一些计算机字符,详请自行搜索"ASCII")而编码方式的不同将会成为编程过程中处理字符的一个难题
                  接下来64b(71b-134b)是Path值,就是path名啦,整整齐齐的"beiduofengbingdu"看起来真顺眼(来自程序猿的审美...)(见下图)

                  接下来64b(135-198b)是Artist值,即作曲家(见下图)

                  再接下来64b(199-262b)是毫无卵用的Composer值(见下图)

                  再接下来64b(263-326b)是同样毫无卵用的SongTime值(见下图)


                  IP属地:四川9楼2017-04-04 10:19
                  收起回复
                    接下来4b(327-330b)是GameTime值,即谱面玩耍的时间(单位:秒),但对实际玩耍无影响,只是会转换成"分:秒"格式后显示在游戏里的歌曲信息里而已(见下图)

                    接下来4b(331-334b)是Region值,代表歌曲的地区分类(欧美、日韩等),具体哪个数字对应哪个我不太清楚...反正我一般都是填0...欢迎dalao补充#(乖)(见下图)

                    接下来4b(335-338b)是Style值,代表歌曲的风格分类(古典、流行等),具体哪个数字对应哪个我还是不太清楚....反正我一般也都是填0...同样欢迎dalao补充#(乖)(见下图)

                    接下来2b(339-340b)是IsNew值,表示歌曲是否带有"NEW"标签,0为无,1为有(见下图)

                    接下来2b(341-342b)是IsHot值,表示歌曲是否带有"HOT"标签,0为无,1为有(见下图)

                    接下来2b(343-344b)是IsRecommend值,表示歌曲是否带有"奖励"标签,0为无,1为有(见下图)(注意只是标签,不是代表此歌被设为奖励歌曲,标签是像"NEW""HOT"这样挂在歌曲框左下角的那种)

                    接下来64b(345-408b)是无卵用的BPM值(说是值其实是字符串...)(见下图)

                    接下来2b(409-410b)是至关重要的Open值,表示歌曲是否能显示在列表里,0为否,1为是,一定要设为1,一定要设为1,一定要设为1!!!(见下图)

                    接下来1b(没错只有第411b这1b!)是同样重要的CanBuy值!!!表示歌曲是否为可以购买,0为否,1为是,一般设为0(见下图)

                    接下来4b(412-415b)是关于排序的OrderIndex值(见下图)

                    这个OrderIndex值功能比较神奇,此值大小范围为-2147483647~21474836476(还是0-4294967295来着???反正0~21474836476是肯定有的)除了0默认排在最后,此值越小,在游戏的歌曲列表中在排序时越靠前,若此值相同,则按ID降序排列歌曲


                    IP属地:四川10楼2017-04-04 10:24
                    收起回复
                      已收藏


                      IP属地:福建来自Android客户端11楼2017-04-04 10:26
                      收起回复
                        接下来1b(第416b)是重要的IsFree值,表示此歌是否为免费歌曲,与上面相反!这里0反倒表示是!!1反倒表示否!!!所以这里一定要设为0!所以这里一定要设为0!所以这里一定要设为0!(见下图)

                        接下来1b(第417b)是SongPkg值,表示此歌属于哪个曲包,0不属于任何曲包,1属于动漫曲包(见下图)

                        接下来64b(418-481b)是无卵用的FreeBeginTime值(见下图)

                        接下来64b(482-545b)是同样无卵用的FreeEndTime值(见下图)

                        接下来18b(546-563b)是各个k数的各个的难度等级值,每2b为一个k数的一个难度的难度等级(见下图)

                        接下来4b(564-567b)是没什么卵用的Price值(见下图)

                        接下来128b(没错568-695b足足128b!!!)是NoteNumber值,每个难度的note数用半角的英文逗号(,)隔开,顺序与前面各个k数的各个的难度等级的排列顺序相同,没有则在逗号中间留空就行了,留空默认为0(见下图)

                        接下来128b(696-823b)是不明意义的ProductID(见下图)
                        (话说光速搞这么大一个空间却不明意义是闹哪样...)

                        接下来4b(824-827b)是VipFlag值,表示歌曲是否有VIP标志(标志就是像"免费""等级""隐藏"这些挂在歌曲栏右部分的小椭圆里的东东),0为无,1为有(好像还会把歌曲变成付费歌曲的样子,具体还没试过),我一般设为0(见下图)

                        最后3b(828-830b)依次为IsHide、IsReward、IsLevelReward值,都只有1b,依次表示是否为隐藏歌曲,是否为奖励歌曲,是否为等级奖励歌曲,同时还会使歌曲带上依次为"隐藏""奖励""等级"的标志,0为否,1为是,如果设为1(是)的话歌曲应该是不会出现在列表栏里的因为服务器里没有记载你获得过此隐藏/奖励/等级歌的...(见下图)


                        IP属地:四川12楼2017-04-04 10:30
                        收起回复
                          以上的东西总结起来大概就是这样了
                          注:
                          1、推荐值里带#的是可修改并且修改后有一定作用的,没带#是指修改后没什么作用甚至有副作用的
                          2、字节位置是从0开始排的所以数据和上面说的相差1

                          楼中楼会放这个文件链接


                          IP属地:四川13楼2017-04-04 10:34
                          收起回复
                            膜拜技术大佬


                            IP属地:四川来自Android客户端16楼2017-04-04 10:39
                            收起回复