2012-02-15 2 views
0

Ruby 1.8에서 Ruby-FFI로 작업하여 UTF-16LE 문자열을 사용하는 라이브러리를 래핑했습니다. 라이브러리에는 이러한 String을 반환하는 C 함수가 있습니다. 내가Ruby-FFI (ruby 1.8) : UTF-16LE로 인코딩 된 문자열 읽기

attach_function [:getVersion, [], :pointer] 

과 기능을 포장하고 반환 된 포인터에 read_string 전화, 또는 때문에 나는, 내가 돌아 가야하는 첫 번째 문자가

attach_function [:getVersion, [], :string] 

로 포장 있는지 여부

두 번째 문자가 null (\000)이고 결과적으로 FFI는 정상적인 단일 Null 종료 문자열을 처리한다고 가정하기 때문에 FFI는 거기에서 문자열 읽기를 중지합니다.

아마도 Ruby 프로그램이나 FFI 초기화 또는 다른 방법으로 문자열을 UTF-16LE로 인코딩해야한다고 생각합니까? 이 문제를 어떻게 해결할 수 있습니까?

답변

1

좋습니다, 이것은 제가 지금까지 가지고있는 (우아하고) 해결 방법입니다. 여기에는 FFI :: Pointer에 메소드를 추가하는 작업이 포함됩니다. 모든 문자열은 UTF-16LE로 인코딩되기 때문에 내 라이브러리의 컨텍스트에서 호출하는 것이 안전해야합니다. 그렇지 않으면 더블 null이 결코 발생할 수 없으므로 좋지 않을 수 있습니다. 메모리 내의 캐릭터 라인의 경계.

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