【Qt5でアプリ開発】ファイルのハッシュ値を求める

【QtCreatorでアプリ開発】QtCreatorでハッシュ値算出アプリ Qt
スポンサーリンク

今回は、Qt5を使ってファイルのハッシュ値を求めるアプリを作りました。

Qt5でファイルのハッシュ値を求める方法や、ダイアログからファイルを選択する方法をまとめました。

今回作成したアプリケーションは、アプリと言えるほどんものではないですが、アプリ開発の導入として一度作ってみるのもいいかもしれません。

記事の最後に、ソースコードを全て載せておくので、参考にしてください。

アプリケーションの概要

アプリケーションの概要は以下のような感じです。

qmkmd5の動作

大まかに、以下のような手順で処理・機能を追加していきます。

  1. ツールボタンからダイアログを開いて、ファイルを選択する。
  2. 選択したファイルをラベルに表示
  3. convertボタンを押すと、各アルゴリズムでハッシュ値を算出する。
  4. 算出したハッシュ値を各ラベルに表示させる。

こんな流れでまとめていきます。

開発した環境

OS:Linux Mint 18.1 Serena

VirtualBox:6.1.4

QtCreator:3.5.1(Based on Qt5.5.1)

QtDesignerでGUIを作成

まずQtDesignerでGUIを作成していきます。

QtCreatorを開いて、Designボタンをクリックします。

UIを開く

.uiファイルを開いたら、左側のUI部品をMainWindowに追加していきます。

UI要素を選択

今回使用したウィンドウに配置した「オブジェクト」と「オブジェクト名」の対応表をまとめました。

object名

UI部分はこんな感じでできたらOKです。

次にファイルをダイアログから選択する機能を追加しましょう。

スロットを設定する

先ほど、配置したツールボタンとCreateボタンの2種類のボタンにスロットを設定します。

ヘッダーファイルを完成させましょう。

追加するスロットは、ボタンにクリックイベントです。

#ifndef QMKMD5_H
#define QMKMD5_H

#include <QWidget>

namespace Ui {
class qmkmd5;
}

class qmkmd5 : public QWidget
{
    Q_OBJECT

public:
    explicit qmkmd5(QWidget *parent = 0);
    ~qmkmd5();
private slots:
    void on_QButton_clicked();

    void on_toolButton_clicked();

private:
    Ui::qmkmd5 *ui;
};

#endif // QMKMD5_H

ダイアログからファイルを選択する

フォルダを開いてファイルを選択するコードは以下の通りです。

qmkmd5.cpp

//ToolButton:Click Ivent
void qmkmd5::on_toolButton_clicked()
{
    QString selFilter=tr("*");
    QString stCurrent = QDir::currentPath();
    QString fileName = QFileDialog::getOpenFileName(this, tr("ファイルを開く"), stCurrent , tr("すべて(*.*)"), &selFilter,QFileDialog::DontUseCustomDirectoryIcons);
    ui->label_File->setText(fileName);
}

ファイルをダイアログから選択するには以下のクラスを選択します。

クラス名操作内容
QDirカレントディレクトリの取得
QStringファイル名の取得
QStringファイルタイプ
QFileDialogダイアログを開く

ダイアログはクラスQFileDialogのgetOpenFileContent関数を使用します。

この関数はOSのデフォルトのダイアログを使用して、選択したファイルを選択します。

void QFileDialog::getOpenFileContent(const QString &nameFilter, const std::function &fileOpenCompleted void (const QString &, const QByteArray &) &fileOpenCompleted)

公式ドキュメント:https://doc.qt.io/qt-5/qfiledialog.html

この操作は、ツールボタンをクリックした時のイベントとして実装します。

選択したファイル名をQLabelに表示する方法は以下のコードです。

ui->label_File->setText(fileName);

次に、ハッシュ値を算出する関数を作成します。

Qt5でハッシュ値を算出する関数を実装

選択したファイルのハッシュ値を算出する関数は準備しておきましょう。

QByteArray型のfileChecksumという関数名で作成します。

fileChecksum(ファイル名, ハッシュ関数)

QByteArray fileChecksum(const  QString &Fname, QCryptographicHash::Algorithm hashAlgoritm)
{
    QFile f(Fname);
    if(f.open(QFile::ReadOnly)){
        QCryptographicHash hash(hashAlgoritm);
        if(hash.addData(&f)){
            return hash.result().toHex();
        }
    }
    return  QByteArray();
}

使用するクラスは以下の通りです。

クラス名機能操作内容
QByteArrayQByteArrayバイト型の配列を準備
QFileopenファイルを開く
QCryptographicHashAlgorithmハッシュ値アルゴリズムの指定
QCryptographicHashaddDataハッシュ値を算出する対象ファイルデータの追加

fileChecksum関数は、対象ファイルを読み取り専用(ReadOnly)で開き、ハッシュ値を算出しバイト型の配列に格納していきます。

ハッシュ値はバイトを16進数に変更する必要があるため、toHex()を使用します。

それでは最後に、Convertボタンをクリックしてラベルにハッシュ値を転記する動作を実装します。

Convertボタンにハッシュ値表示機能を実装

Convertボタンに各ラベルにハッシュ値を転記する機能を実装します。

//Button:Click Ivent
void qmkmd5::on_QButton_clicked()
{
     QString fileName = ui->label_File->text().toUtf8();
     if(fileName.isEmpty()){
         //キャンセル
     }else{
         //MD5
         QByteArray aryMD5 = fileChecksum(fileName,QCryptographicHash::Md5);
         QString Qhash_MD5 = QString::fromUtf8(aryMD5);
         ui->label_md5->setText(Qhash_MD5);
         //MD4
         QByteArray aryMD4 = fileChecksum(fileName,QCryptographicHash::Md4);
         QString Qhash_MD4 = QString::fromUtf8(aryMD4);
         ui->label_md4->setText(Qhash_MD4);
         //SHA1
         QByteArray arySHA1 = fileChecksum(fileName,QCryptographicHash::Sha1);
         QString Qhash_SHA1 = QString::fromUtf8(arySHA1);
         ui->label_SHA1->setText(Qhash_SHA1);
         //SHA256
         QByteArray arySHA256 = fileChecksum(fileName,QCryptographicHash::Sha256);
         QString Qhash_SHA256 = QString::fromUtf8(arySHA256);
         ui->label_SHA256->setText(Qhash_SHA256);
         //SHA5512
         QByteArray arySHA512 = fileChecksum(fileName,QCryptographicHash::Sha512);
         QString Qhash_SHA512 = QString ::fromUtf8(arySHA512);
         ui->text_SHA512->setText(Qhash_SHA512);
     }
}

ファイル名は「label_File」から取得し、もしファイル名が空だった場合は何も処理しません。

各ハッシュ関数のアルゴリズムごとにハッシュ値を各ラベルに転記します。

これで各機能の紹介は以上です。

最後にビルド・コンパイルしましょう。方法は以下の記事にまとめました。

ファイルのハッシュ値算出 ソースコード

qmkmd5.h

#ifndef QMKMD5_H
#define QMKMD5_H

#include <QWidget>

namespace Ui {
class qmkmd5;
}

class qmkmd5 : public QWidget
{
    Q_OBJECT

public:
    explicit qmkmd5(QWidget *parent = 0);
    ~qmkmd5();
private slots:
    void on_QButton_clicked();

    void on_toolButton_clicked();

private:
    Ui::qmkmd5 *ui;
};

#endif // QMKMD5_H

qmkmd5.cpp

#include "qmkmd5.h"
#include "ui_qmkmd5.h"
#include <QCryptographicHash>
#include <QByteArray>
#include <QFileDialog>
#include <QPropertyAnimation>
#include <QDebug>

qmkmd5::qmkmd5(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::qmkmd5)
{
    ui->setupUi(this);
}

qmkmd5::~qmkmd5()
{
    delete ui;
}

// Calculation a Hasu value
QByteArray fileChecksum(const  QString &Fname, QCryptographicHash::Algorithm hashAlgoritm)
{
    QFile f(Fname);
    if(f.open(QFile::ReadOnly)){
        QCryptographicHash hash(hashAlgoritm);
        if(hash.addData(&f)){//addData(const char* data, intlength)
            return hash.result().toHex();
        }
    }
    return  QByteArray();
}

//Button:Click Ivent
void qmkmd5::on_QButton_clicked()
{
     QString fileName = ui->label_File->text().toUtf8();
     if(fileName.isEmpty()){
         //キャンセル
     }else{
         //MD5
         QByteArray aryMD5 = fileChecksum(fileName,QCryptographicHash::Md5);
         QString Qhash_MD5 = QString::fromUtf8(aryMD5);
         ui->label_md5->setText(Qhash_MD5);
         //MD4
         QByteArray aryMD4 = fileChecksum(fileName,QCryptographicHash::Md4);
         QString Qhash_MD4 = QString::fromUtf8(aryMD4);
         ui->label_md4->setText(Qhash_MD4);
         //SHA1
         QByteArray arySHA1 = fileChecksum(fileName,QCryptographicHash::Sha1);
         QString Qhash_SHA1 = QString::fromUtf8(arySHA1);
         ui->label_SHA1->setText(Qhash_SHA1);
         //SHA256
         QByteArray arySHA256 = fileChecksum(fileName,QCryptographicHash::Sha256);
         QString Qhash_SHA256 = QString::fromUtf8(arySHA256);
         ui->label_SHA256->setText(Qhash_SHA256);
         //SHA5512
         QByteArray arySHA512 = fileChecksum(fileName,QCryptographicHash::Sha512);
         QString Qhash_SHA512 = QString ::fromUtf8(arySHA512);
         ui->text_SHA512->setText(Qhash_SHA512);
     }
}

//ToolButton:Click Ivent
void qmkmd5::on_toolButton_clicked()
{
    QString selFilter=tr("*");
    QString stCurrent = QDir::currentPath();
    QString fileName = QFileDialog::getOpenFileName(this, tr("ファイルを開く"), stCurrent , tr("すべて(*.*)"), &selFilter,QFileDialog::DontUseCustomDirectoryIcons);
    ui->label_File->setText(fileName);
}


// Change Color

まとめ

今回はファイルのハッシュ関数を算出する簡単なアプリケーションを作成しました。

今回アプリケーションを作成するに当たって、参考にしたサイトを以下にまとめました。

ハッシュ値算出

ダイアログの表示

公式ドキュメント

コメント

タイトルとURLをコピーしました