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));
Другие вопросы по тегам