2010-10-20 71 views
3

我有一個C結構是這樣的:Mac OS X上的UniChar正確的JNA映射是什麼?

struct HFSUniStr255 { 
    UInt16 length; 
    UniChar unicode[255]; 
}; 

我已經在預期的方式映射這樣的:

public class HFSUniStr255 extends Structure 
{ 
    public UInt16 length; // UInt16 is just an IntegerType with length 2 for convenience. 

    public /*UniChar*/ char[] unicode = new char[255]; 
    //public /*UniChar*/ byte[] unicode = new byte[255*2]; 
    //public /*UniChar*/ UInt16[] unicode = new UInt16[255]; 

    public HFSUniStr255() 
    { 
    } 

    public HFSUniStr255(Pointer pointer) 
    { 
     super(pointer); 
    } 
} 

如果我用這個版本,我得到的字符串的第二個字符到我的焦炭[](「Aits D」爲「Macintosh HD」)。我假設這是與64位平臺和JNA將值映射到32位wchar_t,然後切斷高16位在每個wchar_t上覆制它們。

如果我使用byte []版本,我會得到使用UTF-16LE字符集正確解碼的數據。

如果我使用UInt16 []版本,我會爲每個字符獲取正確的代碼點,但將它們轉換回字符串會很不方便。

是否有某種方式可以將我的類型定義爲char [],但它是否正確轉換?

回答

0

我不這麼認爲,因爲char是一個解碼的字節序列。

這就是爲什麼你的字節版本就像與手動解碼魅力

如果你想堅持字符我建議:

  • 你鉤JNA用解碼器
  • 或將你的字符數字格式從你得到的UTF-16LE轉換爲內部的JVM字符集,它是unicode

不幸我不知道一個簡單的方法來做任何兩個。

我的意見:堅持與byte[]優化版本


通過你怎麼創建UInt16類的方式?

相關問題