鱼C论坛

 找回密码
 立即注册
查看: 2647|回复: 5

C++ 读取 二进制文件 出现的问题,详细戳进来看

[复制链接]
发表于 2014-1-9 19:55:35 | 显示全部楼层 |阅读模式
3鱼币
我有个DAT文件,里面的内容是:
CNDK鋖R?      data="Hello World"

我用MFC的CFile类来读文件时,只能读取到“CNDK鋖R? ”这么多,后面的读不到了,

我想要读这个文件,并且找到 data=""引号里面的内容,然后对内容进行判断处理,应该怎么操作?
上传文件在下面,SOS啊~~~

date.rar (106 Bytes, 下载次数: 12)

最佳答案

查看完整内容

关键是要知道文件的内容是怎么写进去的!!不知道就要读取只有用UltraEdit、WinHex、vs之类的工具打开来猜,先定位到要读取的字符串的位置再来读。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-9 19:55:36 | 显示全部楼层
本帖最后由 _DEBUG 于 2014-1-10 20:25 编辑

关键是要知道文件的内容是怎么写进去的!!不知道就要读取只有用UltraEdit、WinHex、vs之类的工具打开来猜,先定位到要读取的字符串的位置再来读。
ue.PNG
  1. #include <stdio.h>
  2. #include <afx.h>
  3. #pragma pack(1)
  4. struct UnknownStruct
  5. {
  6. int unknowdata[4];
  7. char maybestr[32];
  8. };
  9. #pragma pack()
  10. int main()
  11. {
  12. char buf[32]={0};
  13. struct UnknownStruct data={0};
  14. CFile file("date.dat",CFile::modeRead);  file.Seek(16,CFile::begin);
  15. file.Read(buf,sizeof(buf));
  16. puts(buf);   //下面是开始说的知道格式的一种常规做法。//file.Read(&data,sizeof(data));
  17. //puts(data.maybestr);
  18. return 0;
  19. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-9 20:39:25 | 显示全部楼层
你肯定是读进去了,只不过写入的东西肯定不全是字符串,全当做字符串来打印的话,其中就有些是不可打印字符。你得弄清楚这个文件的格式,也就是如何写入的,比如最典型的就是把一个结构写入,找到那个结构的定义,把文件读到结构中来,自然文件中哪一段是什么哪一段又是什么就明了了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-10 15:15:28 | 显示全部楼层
楼上说的有道理,我试了一下,文件可以打开但是读不出来,自己用记事本写的东西能写出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-10 19:15:33 | 显示全部楼层

能详细举个例吗?我还是很新很新的……不是很明你的操作过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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#写了个简单的演示代码, 希望能够有所帮助. 若有错误也请不吝赐教, 谢谢!

  1. public class JX3DataFile
  2. {
  3.     //数据长度
  4.     public UInt32 Length { get; private set; }
  5.     //数据校验
  6.     public UInt32 CRC32 { get; private set; }
  7.     //数据内容
  8.     public string Data { get; private set; }

  9.     //构造函数
  10.     public JX3DataFile(string fileName)
  11.     {
  12.         //文件流
  13.         using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  14.         {
  15.             //二进制读取器
  16.             using (BinaryReader br = new BinaryReader(fs))
  17.             {
  18.                 //获取魔数
  19.                 byte[] magic = br.ReadBytes(4);
  20.                 if (magic[0] == 'C' && magic[1] == 'N' && magic[2] == 'D' && magic[3] == 'K')
  21.                 {
  22.                     //获取校验和长度
  23.                     this.CRC32 = br.ReadUInt32();
  24.                     this.Length = br.ReadUInt32();
  25.                     //这里不确定, 我遇到的都是相同的所以第二个直接跳过
  26.                     br.ReadUInt32();
  27.                     //读剩下的所有内容并进行转换, GBK编码
  28.                     byte[] content = br.ReadBytes((int)this.Length);
  29.                     this.Data = Encoding.GetEncoding(936).GetString(content);
  30.                     //这里可以做CRC32的校验, 不过一般能在游戏客户端跑起来的都没啥问题所以可以略过
  31.                 }
  32.                 else
  33.                 {
  34.                     throw new FormatException("文件格式不匹配");
  35.                 }
  36.             }
  37.         }
  38.     }
  39. }

  40. class Program
  41. {
  42.     static void Main(string[] args)
  43.     {
  44.         JX3DataFile file = new JX3DataFile("Face_StandardMale_20180101-214242_Create.dat");
  45.     }
  46. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 11:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表