byte[] 到 RubyString 用于 JRuby Java 扩展中的字符串异或
byte[] to RubyString for string xor in JRuby Java Extension
我正在尝试为 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?
}
此外,如何就地执行相同的操作(即 x
s 值已更新)?
您首先需要将字节包装在 ByteList
: new ByteList(xBytes, false)
中。最后一个参数 (Boolean copy
) 指示是否包装字节数组的副本。
要就地更新字符串,请使用 [RubyString#setValue()][2]
:
x.setValue(new ByteList(xBytes, false);
return x;
要return一个新的RubyString
,您可以将该列表传递给当前运行时的#newString()
:
return context.runtime.newString(new ByteList(xBytes, false));
return context.runtime.newString(new ByteList(xBytes, false));
我正在尝试为 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?
}
此外,如何就地执行相同的操作(即 x
s 值已更新)?
您首先需要将字节包装在 ByteList
: new ByteList(xBytes, false)
中。最后一个参数 (Boolean copy
) 指示是否包装字节数组的副本。
要就地更新字符串,请使用 [RubyString#setValue()][2]
:
x.setValue(new ByteList(xBytes, false);
return x;
要return一个新的RubyString
,您可以将该列表传递给当前运行时的#newString()
:
return context.runtime.newString(new ByteList(xBytes, false));
return context.runtime.newString(new ByteList(xBytes, false));