2015-07-13 1 views
3

Я пытаюсь реализовать расширение Java для JRuby для выполнения строковых xors. Я просто не зная, как приведение типа массива байт в RubyString:byte [] to RubyString для строки xor в JRuby Java Extension

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 сек значения обновляется)?

+0

Там являются конструкторами RubyString, которые принимают 'byte []' here' org.jruby.RubyString.RubyString (Ruby runtime, RubyClass rubyClas s, byte [] value] 'Не уверен, что это применимо в этом случае? – xkickflip

+0

Выглядит многообещающе. Любая идея, каким должен быть аргумент 'rubyClass'? – fny

+0

Не уверен в этом аргументе, к сожалению. Я использовал Jruby в течение многих лет, но раньше не пробовал писать расширение. Отбрасывание каналом #jruby на freenode irc может быть самым быстрым способом получить дополнительную информацию – xkickflip

ответ

1

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

+1

Что это? Некоторые объяснения были бы приятными. Если вы не хотите этого делать, отправьте комментарий. –

0

Сначала необходимо обернуть байты в 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));