byte[] в RubyString для строки xor в расширении JRuby Java
Я пытаюсь реализовать расширение Java для JRuby для выполнения Xors строки. Я просто не уверен, как набрать приведение байтового массива в 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
значение обновляется)?
2 ответа
Решение
return context.runtime.newString(new ByteList(xBytes, false));
Сначала вам нужно обернуть байты в ByteList
: new ByteList(xBytes, false)
, Последний параметр (Boolean copy
) определяет, следует ли переносить копию массива байтов.
Чтобы обновить строку на месте, используйте [RubyString#setValue()][2]
:
x.setValue(new ByteList(xBytes, false);
return x;
Вернуть новый RubyString
вы можете передать этот список в текущую среду выполнения #newString()
:
return context.runtime.newString(new ByteList(xBytes, false));