【问题标题】:byte[] to RubyString for string xor in JRuby Java Extensionbyte[] 到 RubyString 用于 JRuby Java 扩展中的字符串异或
【发布时间】:2015-10-01 05:05:39
【问题描述】:

我正在尝试为 JRuby 实现一个 Java 扩展来执行字符串异或。我只是不确定如何将字节数组类型转换为RubyString

public static RubyString xor(ThreadContext context,  IRubyObject self, RubyString x, RubyString y) {
    byte[] xBytes = x.getBytes();
    byte[] yBytes = y.getBytes();

    int length = yBytes.length < xBytes.length ? yBytes.length : xBytes.length;

    for(int i = 0; i < length; i++) {
        xBytes[i] = (byte) (xBytes[i] ^ yBytes[i]);
    }

    // How to return a RubyString with xBytes as its content?
}

另外,如何就地执行相同的操作(即更新xs 值)?

【问题讨论】:

  • RubyString 上的构造函数在这里接受byte[] org.jruby.RubyString.RubyString(Ruby runtime, RubyClass rubyClass, byte[] value) 不确定这是否适用于这种情况?
  • 看起来很有希望。知道rubyClass 参数应该是什么吗?
  • 不幸的是不确定这个论点。我已经使用 Jruby 多年,但之前没有尝试过编写扩展程序。通过 freenode irc 上的#jruby 频道删除可能是获取更多信息的最快方式

标签: java jruby jruby-java-interop


【解决方案1】:

return context.runtime.newString(new ByteList(xBytes, false));

【讨论】:

  • 这是什么?一些解释会很好。如果您不想这样做,请发表评论。
【解决方案2】:

您首先需要将字节包装在 ByteList: new ByteList(xBytes, false) 中。最后一个参数 (Boolean copy) 指示是否包装 Byte 数组的副本。

要更新字符串,请使用[RubyString#setValue()][2]

x.setValue(new ByteList(xBytes, false);
return x;

要返回一个新的RubyString,您可以将该列表传递给当前运行时的#newString()

return context.runtime.newString(new ByteList(xBytes, false));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2012-08-13
    • 2013-03-08
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多