2011-01-05 25 views
17

Tôi đang cố gắng lấy mã hóa MD5 từ MySQL DB qua mã Java (Hibernate). Nhưng tôi không thể nhận được chuỗi cũng không phải bất kỳ loại Java hợp lý nào.Loại Java nào là "[B"?

Điều duy nhất tôi nhận được là thông điệp vô ích này: java.lang.ClassCastException: [B không thể được đúc để com.mysql.jdbc.Blob (hoặc bất kỳ loại Java Tôi cố gắng đúc đến).

Đây là phương pháp của tôi:

public void testCrypto() { 
     session.beginTransaction(); 
     // creates native SQL query 
     // uses native MySQL's MD5 crypto 
     final Blob pass = (Blob) session.createSQLQuery("SELECT MD5('somePass')") 
      .list().get(0); 
     session.getTransaction().commit(); 
} 

Dưới đây là đầy đủ stack trace:

java.lang.ClassCastException: [B cannot be cast to com.mysql.jdbc.Blob 
    at domain.DatabaseTest.testCrypto(DatabaseTest.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at junit.framework.TestCase.runTest(TestCase.java:168) 
    at junit.framework.TestCase.runBare(TestCase.java:134) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:232) 
    at junit.framework.TestSuite.run(TestSuite.java:227) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Trả lời

35

Đó bạn tôi là một mảng byte. Trong JNI, [B được sử dụng để mô tả một mảng ([) của byte (B). Một mảng ints là [I, vv

Bạn có thể lấy thêm một chút thông tin về mô tả lĩnh vực ở đây:
http://java.sun.com/docs/books/jni/html/types.html (section 12.3.3 nên được những gì bạn đang tìm kiếm).

+0

Cảm ơn bạn, bạn đã được hữu ích nhất! – Xorty

3

[B là tên kiểu được mã hóa cho mảng byte (byte []), thường chỉ xuất hiện trong chuỗi chữ ký loại vì không phải là tên loại hợp lệ.

6

Đó là tên lớp là byte[].class. Hãy thử điều này:

System.out.println(byte[].class.getName()); 

Output (bạn đoán nó):

[B

Và nếu bạn muốn truy cập vào tên dễ đọc, sử dụng Class.getCanonicalName():

System.out.println(byte[].class.getCanonicalName()); 

Đầu ra:

byte []

4

Như tình trạng câu trả lời khác, đó là một mảng byte.

Nếu bạn muốn nhận được một chuỗi từ một mảng byte, sử dụng String constructor:

public void testCrypto() 
{ 
     session.beginTransaction(); 
     // creates native SQL query 
     // uses native MySQL's MD5 crypto 
     final String pass = new String(session.createSQLQuery("SELECT MD5('somePass')") 
      .list().get(0)); 
     session.getTransaction().commit(); 
} 
+0

tuyệt vời, nhưng đây thực sự là hành vi kỳ lạ! Chuỗi này là chính xác giống như những gì in mysql console. Nhưng chiều dài pass.getBytes(). Dài 32 và MD5 phải là 128bits. Tôi đã mất đầu mối ở đâu? – Xorty

+1

@Xorty: Có sự khác biệt giữa đo cường độ mã hóa và độ dài của chuỗi. MD5 sẽ chuyển đổi bất kỳ đầu vào nào thành chuỗi không có nhiều hơn và không ít hơn 32 ký tự hex. –

+0

Tuyệt vời, huyền thoại bị vỡ;) – Xorty

Các vấn đề liên quan