1

私はJavaが初めてで、本当に助けが必要です。ファイルの MD5 ハッシュを取得するために、コマンド ライン ツールを作成しました。これは機能したので、コードを調整して GUI 形式にしました。2 つのプログラムは、同じファイルの異なるハッシュを提供し、混乱を招きます。私はUTF-8を調べましたが、私が知る限り、それは文字列に対してのみ機能し、ファイルインスタンスでは機能しません. 異なるハッシュ値を提供している理由を教えて、正しい方向に向けることができますか?

最初の方法 (コマンド ライン)...

    public static void main(String args[]) throws IOException, NoSuchAlgorithmException {

    System.out.println("Please enter file path: \n");

    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    String dir = stdin.readLine();
    File file = new File(dir);

    FileInputStream iStream = null;

    try {iStream = new FileInputStream(file);}
    catch (FileNotFoundException e) {      
        String MD5Output = "There has been an error: " + e.toString();   
    }

    byte[] dataBytes = new byte[1024];

    MessageDigest md = MessageDigest.getInstance("MD5");

    int numRead = iStream.read(dataBytes);
        md.update(dataBytes, 0, numRead);

        iStream.close();

        dataBytes = md.digest();

    md.update(dataBytes);
    System.out.println("MD5: " + new BigInteger(1, md.digest()).toString(16));

}

2番目の方法(GUI用に構築)...

    public void doMD5() throws IOException, NoSuchAlgorithmException {

    File file = new File(jTxtMD51.getText());

    FileInputStream iStream = null;

    try {iStream = new FileInputStream(file);}
    catch (FileNotFoundException e) {      
        String MD5Output = "There has been an error: " + e.toString();   
    }

    byte[] dataBytes = new byte[1024];

    MessageDigest md = MessageDigest.getInstance("MD5");

    int numRead = iStream.read(dataBytes);
        md.update(dataBytes, 0, numRead);

        iStream.close();

        byte[] MD5checksum = md.digest();

    md.update(dataBytes);

    BigInteger bigInt = new BigInteger(1, md.digest());
    String MD5Hash = bigInt.toString(16);

    jTextOutput.append("MD5 is : " + MD5Hash);

}
4

2 に答える 2

1

ストリームからの読み取り呼び出しは 1 つだけです。InputStream を読み取るときにループする必要があります(全体を読み取りたいと仮定すると、通常は必要になります)。さらに、同じバイトを使用して digest.update() を 2 回呼び出しているようです。

また、通常、ハッシュ値が出力される場合、それはバイナリ値であるため、base64 エンコーディングを使用して出力されます。

于 2012-03-22T19:26:41.063 に答える
0

@jtahlbornのコメントに加えてmd.update(databytes);、両方のメソッドで呼び出す必要はありません。2番目のメソッドの最後にこれを含める必要があります。

BigInteger bigInt = new BigInteger(1, MD5checksum);

最初のメソッドは、この2番目のdigest()の呼び出しを行いません。この呼び出しは、update()を呼び出すと値が変わります。

于 2012-03-22T19:31:55.373 に答える