2015-07-13 41 views
3

我試圖爲JRuby實現一個Java擴展來執行字符串xors。我只是不確定如何強制類型轉換的字節數組爲RubyStringbyte [] to RubyString用於JRuby Java擴展中的字符串xor

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 []'org.jruby.RubyString.RubyString(Ruby運行時,RubyClass ruby​​Clas s,byte []值)'不確定這是否適用於這種情況? – xkickflip

+0

看起來很有希望。任何想法'rubyClass'參數應該是什麼? – fny

+0

不幸的是不確定這個論點。我已經使用了Jruby多年,但還沒有嘗試過寫過擴展。在freenode irc上#jruby頻道下降可能是獲得更多信息的最快途徑 – xkickflip

回答

1

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

+1

這是什麼?一些解釋會很好。如果你不想這樣做,請發表評論。 –

0

您首先需要將字節包裝在ByteListnew ByteList(xBytes, false)中。最後一個參數(Boolean copy)指示是否要包裝Byte數組的副本。

要更新到位的字符串,請使用[RubyString#setValue()][2]

​​

返回一個新RubyString,您可以在列表傳遞到當前運行的#newString()

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