Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JRuby Java扩展中字符串xor的字节[]到RubyString_Java_Jruby_Jruby Java Interop - Fatal编程技术网

JRuby Java扩展中字符串xor的字节[]到RubyString

JRuby Java扩展中字符串xor的字节[]到RubyString,java,jruby,jruby-java-interop,Java,Jruby,Jruby Java Interop,我试图为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 = yByte

我试图为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?
}
公共静态RubyString xor(线程上下文、IRubyObject自身、RubyString x、RubyString y){
字节[]xBytes=x.getBytes();
字节[]yBytes=y.getBytes();
int length=yBytes.length

另外,如何在适当的位置执行相同的操作(即,
x
s值被更新)?

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

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

x.setValue(new ByteList(xBytes, false);
return x;
要返回新的
RubyString
,可以将该列表传递到当前运行时的:


返回context.runtime.newString(新的字节列表(xBytes,false))

RubyString上有一些构造函数接受
字节[]
这里
org.jruby.RubyString.RubyString(Ruby runtime,RubyClass,byte[]值)
不确定这是否适用于此实例?看起来很有希望。知道
rubyClass
参数应该是什么吗?不幸的是,不确定该参数。我已经使用Jruby很多年了,但以前从未尝试过编写扩展。访问freenode irc上的#jruby频道可能是获取更多信息的最快方式这是什么?解释一下就好了。如果你不想这样做,发表评论。
return context.runtime.newString(new ByteList(xBytes, false));