2010-10-01 26 views
6

Tôi cần truy cập đối tượng Java SecureRandom từ Javascript. Mục tiêu cuối cùng của tôi là lấy 4 byte từ PRNG và chuyển nó thành biến số nguyên Javascript. Theo http://download.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.html, hai dòng sau đây của mã Java có nghĩa vụ phải làm lấy 4 byte ngẫu nhiên:Cách chuyển các mảng byte giữa Java và JavaScript

byte bytes[] = new byte[4]; 
random.nextBytes(bytes); 

vấn đề của tôi là tôi không biết làm thế nào để 1) phân bổ mảng byte thích hợp để thông qua phương pháp Java 2) phân tích mảng đó thành số nguyên sau

Cho đến nay tôi đã quản lý phương thức getSeed() trả về một mảng các byte ngẫu nhiên. Khi tôi hiển thị mã HTML được cung cấp bên dưới trong Firefox, nó hiển thị "[B @ 16f70a4", có vẻ như là một con trỏ hoặc một cái gì đó.

<script> 
var sprng = new java.security.SecureRandom(); 
random = sprng.getSeed(4); 
document.write(random + "<br/>\n"); 
</script> 

Điều này làm cho tôi nghĩ rằng tôi thành công để khởi tạo và truy cập lớp Java, nhưng có vấn đề với chuyển đổi loại.

bất cứ ai có thể vui lòng giúp tôi viết allocateJavaByteArray (N)convertJavaByteArrayToInt (N) để cho công việc mã sau:

var sprng = new java.security.SecureRandom(); 
var nextBytes = allocateJavaByteArray(4); 
srng.nextBytes(nextBytes); 
var nextInt = convertJavaByteArrayToInt(4); 

Cảm ơn bạn trước.

+0

Loại ngữ cảnh kỳ lạ nào mà bạn có thể nhận được tại thời gian chạy Java từ một '

0

Bạn chỉ có thể tạo ra một số nguyên ngẫu nhiên ở nơi đầu tiên, như thế này:

var nextInt = sprng.nextInt(); 
2

Bạn có thể thực hiện convertJavaByteArrayToInt như thế này:

function convertJavaByteArrayToInt(bytes) { 
    var r = 0; 
    for (var i = 0; i < bytes.length; i++) { 
    r += (bytes[i] & 0xff) << (8 * i); 
    } 
    return r; 
} 

allocateJavaByteArray là khó thực hiện, bởi vì chúng tôi không thể có được Lớp của byte. Vì vậy, bạn không thể sử dụng java.lang.reflect.Array.newInstance để tạo một trường hợp byte []. Nhưng đây là một việc thực hiện khó khăn:

function allocateJavaByteArray(n) { 
    var r = ""; 
    for (var i = 0; i < n; i++) { 
    r += "0"; 
    } 
    return new java.lang.String(r).getBytes(); 
} 

cập nhật: Có vẻ như rằng trên mã không làm việc trong FireFox 3.6. Dưới đây là một allocateJavaByteArray thực hiện, có một thử:

function allocateJavaByteArray(n) { 
    var r = new java.io.ByteArrayOutputStream(4); 
    for (var i = 0; i < n; i++) { 
    r.write(0); 
    } 
    return r.toByteArray(); 
} 
+0

Cảm ơn. Tôi đã thử mã của bạn: http://pastebin.com/UW59urTW. Thật không may convertJavaByteArrayToInt() trả về 0. Tôi không biết nếu nó là một vấn đề chuyển đổi hoặc có lẽ lệnh gọi SPRNG là không chính xác. – abb

+0

thay đổi ** convertJavaByteArrayToInt (4) ** thành ** convertJavaByteArrayToInt (nextBytes) **, bạn sẽ nhận được những gì bạn muốn. – baotuo

+0

Sự khác biệt tương tự, tôi vẫn nhận được 0.I thử trên Firefox 3.6.17 trên Ubuntu. Bạn đang làm việc với trình duyệt/nền tảng nào? – abb

0

Java chuỗi là điều duy nhất mà sẽ vượt qua Java-> JS hoặc JS-> Java mà không đau đầu.

byte [] hoặc bất kỳ arry nào sẽ được xem trong JS dưới dạng JSObject.


var sprng = new java.security.SecureRandom(); 

var foo= new java.package.SomeClass(); 

làm việc trong Netscape/Mozilla/FF

Nó cần truy cập đến các lớp học, vì vậy bất kỳ lớp chuẩn java hoặc bạn cần phải tải một jar và sau đó truy cập vào lớp học.


cho câu hỏi ban đầu:

  1. tạo Applet whith phương pháp hữu ích:

    public String someStringEncodedValue() { trở 1+ "|" 2; }

  2. bao gồm Applet vào trang với id duy nhất

  3. JS tìm Applet sử dụng id duy nhất

  4. gọi phương thức

  5. chuỗi phân tích cú pháp (chia bởi |)

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