2012-02-15 11 views
0

私はRuby 1.8でUTF-16LE文字列を使用するライブラリをラップするためにRuby-FFIを使用しています。ライブラリには、このようなStringを返すC関数があります。私はRuby-FFI(ruby 1.8):UTF-16LEでエンコードされた文字列を読み取る

attach_function [:getVersion, [], :pointer] 

と機能をラップし、返されたポインタにread_stringを呼び出し、またはので、私は、私は戻って取得する唯一の最初の文字がある

attach_function [:getVersion, [], :string] 

でそれをラップするかどうかは

2番目の文字がヌル(\000)であるため、FFIは文字列の読み込みを停止します。これは、通常の単一ヌル終了文字列を処理していると仮定しているためです。

RubyプログラムやFFIなどの初期化時に、私は文字列がUTF-16LEでエンコードされることを期待していますか?これ以外はどうすればいいですか?

答えて

1

これは私がこれまで行ってきた(洗練された)回避策です。これには、FFI :: Pointerにメソッドを追加することが含まれます。すべての文字列はUTF-16LEでエンコードされているはずなので、私のライブラリの文脈で呼び出すのは安全です。そうでなければ、ダブルヌルに遭遇することはないかもしれません。メモリ内の文字列の境界。

module FFI 
    class Pointer 

    # Read string until we encounter a double-null terminator 
    def read_string_dn 
     cont_nullcount = 0 
     offset = 0 
     # Determine the offset in memory of the expected double-null 
     until cont_nullcount == 2 
     byte = get_bytes(offset,1) 
     cont_nullcount += 1 if byte == "\000" 
     cont_nullcount = 0 if byte != "\000" 
     offset += 1 
     end 
     # Return string with calculated length (offset) including terminator 
     get_bytes(0,offset+1) 
    end 

    end 

end 
関連する問題