【问题标题】:How to pass byte arrays between Java and JavaScript如何在 Java 和 JavaScript 之间传递字节数组
【发布时间】:2011-04-19 19:55:05
【问题描述】:

我需要从 Javascript 访问 SecureRandom Java 对象。我的最终目标是从 PRNG 中获取 4 个字节并将其转换为 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() 方法。当我在 Firefox 中呈现下面提供的 HTML 代码时,它显示“[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);

提前谢谢你。

【问题讨论】:

  • 在 Java 运行时可以从 &lt;script&gt; 标签获得什么样的奇怪上下文?我认为这里可能存在一些混乱。
  • 我已经在 Ubuntu 上的 Firefox 3.0 中对其进行了测试。另请参阅docstore.mik.ua/orelly/webprog/jscript/ch22_03.htm
  • 为 java 找到一个好的 JSON 编码类并且只传递 JSON 作为 javascript 的任何数据。顺便说一句 - 我也不明白你是如何将 java 放在
  • 除非您更愿意拒绝,请考虑检查我上面提供的链接和/或在基于 Mozilla 的浏览器中运行我在 OP 中提供的一段 Javascript 代码。但它在 IE 中不起作用。
  • 老问题,我知道,但是您是否碰巧找到了解决方案?我也有同样的问题...

标签: java javascript arrays byte


【解决方案1】:

通常你会在服务器上生成随机数并在请求中将它传递给jsp。

【讨论】:

  • 托尼,感谢您的评论,但 JSP 与我的情况无关。一切都发生在客户端。
  • @abb 也许你把 Java 和 JavaScript 搞混了?
【解决方案2】:

您可以简单地首先生成一个随机整数,如下所示:

var nextInt = sprng.nextInt();

【讨论】:

    【解决方案3】:

    您可以像这样实现 convertJavaByteArrayToInt

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

    allocateJavaByteArray很难实现,因为我们无法获取byteClass。所以不可能使用 java.lang.reflect.Array.newInstance 来创建 byte[] 实例。但这里有一个棘手的实现:

    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();
    }
    

    【讨论】:

    • 谢谢。我试过你的代码:pastebin.com/UW59urTW。不幸的是 convertJavaByteArrayToInt() 返回 0。我不知道是转换问题还是 SPRNG 调用不正确。
    • convertJavaByteArrayToInt(4) 改为 convertJavaByteArrayToInt(nextBytes) ,你会得到你想要的。
    • 同样的区别,我仍然得到 0。我在 Ubuntu 上的 Firefox 3.6.17 上试了一下。它在什么浏览器/平台上运行?
    • 数组分配似乎有问题。如果我尝试获取它的长度,我会得到“public netscape.javascript.JSException(int,java.lang.Object)”而不是预期的 4。任何线索为什么?这是更新后的代码:pastebin.com/fFr9rwqz
    • 我用 FF4.01/MacOSX 测试过。一切正常。
    【解决方案4】:

    Java 字符串是唯一可以通过 Java->JS 或 JS->Java 而不令人头疼的东西。

    byte[] 或任何数组将在 JS 中被视为 JSObject。


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

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

    在 Netscape/Mozilla/FF 中工作

    它需要访问类,所以任何java标准类或者你需要加载一个jar然后访问类。


    到原始问题:

    1. 使用实用方法创建小程序:

      公共字符串 someStringEncodedValue(){ 返回 1+"|"+2; }

    2. 将小程序包含到具有唯一 ID 的页面中

    3. JS 使用唯一 id 查找小程序

    4. 调用方法

    5. 解析字符串(用|分割)

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2013-03-29
      • 2018-06-29
      • 2021-10-02
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多