Как передать байтовые массивы между Java и JavaScript - PullRequest
6 голосов
/ 01 октября 2010

Мне нужно получить доступ к SecureRandom Java Object из Javascript. Моя конечная цель - получить 4 байта из PRNG и преобразовать его в целочисленную переменную Javascript. Согласно http://download.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.html, следующие две строки кода Java должны делать 4 случайных байта:

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

Мои проблемы в том, что я не знаю, как 1) выделить байтовый массив, подходящий для передачи в метод Java 2) потом разобрать этот массив в целое число

До сих пор мне удалось получить метод getSeed (), который возвращает массив случайных байтов. Когда я отображаю HTML-код, представленный ниже в Firefox, он показывает «[B @ 16f70a4», который выглядит как указатель или что-то в этом роде.

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

Это заставляет меня думать, что мне удалось создать экземпляр класса Java и получить к нему доступ, но возникла проблема с преобразованием типов.

Может ли кто-нибудь помочь мне написать allocateJavaByteArray (N) и convertJavaByteArrayToInt (N) , чтобы разрешить следующий код:

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

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 31 мая 2011

Вы можете реализовать convertJavaByteArrayToInt следующим образом:

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

allocateJavaByteArray сложно реализовать, потому что мы не можем получить Class из байт .Поэтому невозможно использовать java.lang.reflect.Array.newInstance для создания байта [] экземпляра.Но вот сложная реализация:

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

обновлено : кажется, что вышеприведенный код не работал в FireFox 3.6.Вот еще одна реализация allocateJavaByteArray , попробуйте:

function allocateJavaByteArray(n) {
  var r = new java.io.ByteArrayOutputStream(4);
  for (var i = 0; i < n; i++) {
    r.write(0);
  }
  return r.toByteArray();
}
0 голосов
/ 02 ноября 2013

Строка Java - это единственное, что передаст Java-> JS или JS-> Java без головной боли.

byte [] или любая строка будет рассматриваться в JS как JSObject.


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

is

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

работает в Netscape / Mozilla / FF

Требуется доступ к классам, поэтому любой стандартный класс Java или вам нужно загрузить JAR, а затемполучить доступ к классу.


к первоначальному вопросу:

  1. создать апплет с помощью служебного метода:

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

  2. включить апплет на страницу с уникальным идентификатором

  3. JS найти апплет с использованием уникального идентификатора

  4. метод вызова

  5. строка синтаксического анализа (разделенная на |)

0 голосов
/ 07 октября 2010

Во-первых, вы можете просто сгенерировать случайное целое число, например:

var nextInt = sprng.nextInt();
0 голосов
/ 01 октября 2010

Обычно вы генерируете случайное число на сервере и передаете его в Запрос на jsp.

...