QT 对文件头的读写

holymaple 2012-12-05 01:33:01
请问一下在QT下怎么对 文件头 的读写啊?
注意看是 “文件头” 而不是 “头文件” 哟
网上百度了很久,几乎找不到先关资料,有也是貌似API或者是C语言的,可是我看不懂那些例子,有没有好心人可以教一下在QT下如何对 文件头 进行读写?

本人学生,最近在做一个功能,就是把 一个文件的文件头进行修改,此时它就会变成一个不可识别的文件类型,然后在把它的图标关联到一个自定义的图标里面。

有没有牛人提供相关的具体操作实现?拜托了·····

最近比较赶时间,就差这个功能了
...全文
675 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
holymaple 2012-12-15
  • 打赏
  • 举报
回复
引用 10 楼 jdwx1 的回复:
引用 9 楼 holymaple 的回复:引用 8 楼 jdwx1 的回复:二进制只是一串二进制编码,完全看你怎么读出来.怎么读出来的,再怎么写回去。 7楼的朋友你好,我是这样读出来的: in.setVersion(QDataStream::Qt_4_8); quint32 fileMagic; in >> fileMagic; ……
感谢~后来自己摸索摸索着写出最终有用的代码,在回过头来看你的代码,发现原来自己摸索了那么久,最终的代码就是你这个,不过跟之前相比现在已经更加理解了这段代码,朋友,谢谢你~
jdwx 2012-12-06
  • 打赏
  • 举报
回复
二进制只是一串二进制编码,完全看你怎么读出来.怎么读出来的,再怎么写回去。
holymaple 2012-12-06
  • 打赏
  • 举报
回复
引用 6 楼 HeadmasterWang 的回复:
先QFile把文件加载过来, 然后QDateStream把文件和流关联起来. 然后直接操作流就可以了
QFile test_Data("13.png"); 读取 if (!test_Data.open(QIODevice::ReadOnly)) //以只读和截断方式打开设备 { qDebug() << "could not open file for writing"; return; } QDataStream in(&test_Data); in.setVersion(QDataStream::Qt_4_8); in >> fileMagic; qDebug() << fileMagic <<endl; test_Data.close(); 6楼的朋友你好,我是这样进行读取的,不知道读出来的数据是什么类型的呢?quint32吗? 我想把一个文件的第一个quint32读出来,保存下来,然后进行修改一个已知的quint32值,然后文件就会变得无法识别,然后再修改回原来的值,这样文件就能打开了。 这思路感觉起来是没问题的,怎么我实际操作起来就不行?可能是因为我对Qt的数据类型不了解,转换不好,导致修改之后再修改回来文件依然损坏 所以Qt要怎么修改呢? http://devbean.blog.51cto.com/448512/293892/ 这个例子我反复看了,按照上面来,还是不行,估计跟我读出来的不一样,我qDebug()显示的是一长串的数字。。 quint32 fileMagic = 305419896; in >> fileMagic; 这样。。。 因为读的时候,显示出来的就是 305419896.。。。。要怎么操作呢?先谢谢了···我实在是找了太久了。。。
  • 打赏
  • 举报
回复
先QFile把文件加载过来, 然后QDateStream把文件和流关联起来. 然后直接操作流就可以了
holymaple 2012-12-06
  • 打赏
  • 举报
回复
引用 10 楼 jdwx1 的回复:
引用 9 楼 holymaple 的回复:引用 8 楼 jdwx1 的回复:二进制只是一串二进制编码,完全看你怎么读出来.怎么读出来的,再怎么写回去。 7楼的朋友你好,我是这样读出来的: in.setVersion(QDataStream::Qt_4_8); quint32 fileMagic; in >> fileMagic; ……
朋友你好,很感谢你这么用心回答我的问题。看你的代码我大概已经懂了。 可是我的疑问是,比如一个文件里面的内容是 “1234567890” 破坏文件就是 直接写入前4位(直接写入好像会覆盖掉原值吧?) “abcd567890” 此时文件变得无法识别。破坏之前把前4位保存下来(1234) 恢复文件就是直接写入前4位(提取之前保存的) 变成“1234567890” 而看你的代码,貌似可以做的更绝一点,就是直接保存整个文件的内容(你代码的ba),破坏就随便写入,恢复的时候就把(ba)写回去0.0 其实我现在一直在做一个小软件,老师让我做的,实现文件加密功能,加密的实际就是保存文件的“文件头”然后再写入一个自定义的值,解密的时候就把文件头给写回去。 我奇怪的是,这个写入的话,不是直接覆盖掉同位置的内容的么?读出来的文件头的类型是不是quint32? 不管怎样,真的很感谢你的热心解答~
  • 打赏
  • 举报
回复
引用 10 楼 jdwx1 的回复:
引用 9 楼 holymaple 的回复:引用 8 楼 jdwx1 的回复:二进制只是一串二进制编码,完全看你怎么读出来.怎么读出来的,再怎么写回去。 7楼的朋友你好,我是这样读出来的: in.setVersion(QDataStream::Qt_4_8); quint32 fileMagic; in >> fileMagic; ……
+1
jdwx 2012-12-06
  • 打赏
  • 举报
回复
引用 9 楼 holymaple 的回复:
引用 8 楼 jdwx1 的回复:二进制只是一串二进制编码,完全看你怎么读出来.怎么读出来的,再怎么写回去。 7楼的朋友你好,我是这样读出来的: in.setVersion(QDataStream::Qt_4_8); quint32 fileMagic; in >> fileMagic; qDebug() << fileMag……
void MainWindow::on_actionLock_triggered()
{
    QString str = QFileDialog::getOpenFileName();
    if(str.isEmpty()){
        return;
    }
    QByteArray ba;
    {
        QFile file(str);
        if(!file.open(QFile::ReadOnly)){
            return;
        }
        QDataStream in(&file);
        in >> m_d;
        ba = file.readAll();
    }
    {
        QFile file(str);
        if(!file.open(QFile::WriteOnly)){
            return;
        }
        QDataStream out(&file);
        out << 0xFFFF;
        out << ba;
    }

}
上面的代码是破坏文件的。
void MainWindow::on_actionUnlock_triggered()
{
    QString str = QFileDialog::getOpenFileName();
    if(str.isEmpty()){
        return;
    }
    QByteArray ba;
    {
        QFile file(str);
        if(!file.open(QFile::ReadOnly)){
            return;
        }
        QDataStream in(&file);
        quint32 sk;
        in >> sk;
        ba = file.readAll();
    }
    {
        QFile file(str);
        if(!file.open(QFile::WriteOnly)){
            return;
        }
        QDataStream out(&file);
        out << m_d;
        out << ba;
    }

}
上面的是恢复文件的。 用上面的代码需要声明一个 quint32 m_d的类变量储存文件的前4个字节。
holymaple 2012-12-06
  • 打赏
  • 举报
回复
引用 8 楼 jdwx1 的回复:
二进制只是一串二进制编码,完全看你怎么读出来.怎么读出来的,再怎么写回去。
7楼的朋友你好,我是这样读出来的: in.setVersion(QDataStream::Qt_4_8); quint32 fileMagic; in >> fileMagic; qDebug() << fileMagic <<endl; 结果显示: 4292411360 于是我又这样写一次: QDataStream out(&test_Data); quint32 sb = quint32(4292411360); out << sb; 按照我的理解,要是我读取出比如文件第一个二进制编码,然后再写同样的进去,里面的内容应该是不变的,然后文件还是可以打开才对,可是我这样做文件就无法打开了。。。 注:读写的并不是TXT文件。
holymaple 2012-12-05
  • 打赏
  • 举报
回复
引用 2 楼 jdwx1 的回复:
文件头,jpeg的文件头4个字节是0xFFD8,估计就是这个意思吧:把0xFFD8变为0xFFD9.
ER。。。我是想知道怎么对文件头进行读写。。网上百度许久未果呀
holymaple 2012-12-05
  • 打赏
  • 举报
回复
引用 1 楼 heksn 的回复:
首先你要搞清楚文件头的格式才能读取,读取用QFile QTextStream
ER。。。因为是用户选择的任何文件。。。 我听老师说每一个文件(除了txt和文件夹没有)都带有一个“文件头”,想要把文件头给保存下来,然后替换成自己的文件头,这个文件头要可以显示到自己预设的图标的。。。 有没有操作思路提供一下?LZ百度能力实在是弱爆了····
ken451016394 2012-12-05
  • 打赏
  • 举报
回复
如上楼所说,可以解决你的问题!
jdwx 2012-12-05
  • 打赏
  • 举报
回复
文件头,jpeg的文件头4个字节是0xFFD8,估计就是这个意思吧:把0xFFD8变为0xFFD9.
  • 打赏
  • 举报
回复
首先你要搞清楚文件头的格式才能读取,读取用QFile QTextStream

16,202

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧