|
发表于 2018-1-2 07:11:43
|
显示全部楼层
本帖最后由 whc2001 于 2018-1-2 07:14 编辑
今天也第一次研究这个格式的文件, 感觉似乎和楼主的档案来自同一个公司的同一个产品, 根据个人的判断, 这个文件总共由以下四部分组成:
1) 文件头 4字节ASCII 恒为CNDK(0x434E444B)
2) 数据区域CRC32校验 小端在前
3) 4字节数据区域长度 重复两遍(不确定, 我遇到的都是相同的值重复两遍) 小端在前
4) 主数据区域 在我这边格式是很像JSON但是很多地方都不一样的谜之格式
因此这个文件一定要用二进制方式来打开和读取, 不是很熟悉C++就用C#写了个简单的演示代码, 希望能够有所帮助. 若有错误也请不吝赐教, 谢谢!
- public class JX3DataFile
- {
- //数据长度
- public UInt32 Length { get; private set; }
- //数据校验
- public UInt32 CRC32 { get; private set; }
- //数据内容
- public string Data { get; private set; }
- //构造函数
- public JX3DataFile(string fileName)
- {
- //文件流
- using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- //二进制读取器
- using (BinaryReader br = new BinaryReader(fs))
- {
- //获取魔数
- byte[] magic = br.ReadBytes(4);
- if (magic[0] == 'C' && magic[1] == 'N' && magic[2] == 'D' && magic[3] == 'K')
- {
- //获取校验和长度
- this.CRC32 = br.ReadUInt32();
- this.Length = br.ReadUInt32();
- //这里不确定, 我遇到的都是相同的所以第二个直接跳过
- br.ReadUInt32();
- //读剩下的所有内容并进行转换, GBK编码
- byte[] content = br.ReadBytes((int)this.Length);
- this.Data = Encoding.GetEncoding(936).GetString(content);
- //这里可以做CRC32的校验, 不过一般能在游戏客户端跑起来的都没啥问题所以可以略过
- }
- else
- {
- throw new FormatException("文件格式不匹配");
- }
- }
- }
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- JX3DataFile file = new JX3DataFile("Face_StandardMale_20180101-214242_Create.dat");
- }
- }
复制代码 |
|