2010-10-20 2 views
3

J'ai un struct C comme ceci:Quel est le mappage JNA correct pour UniChar sous Mac OS X?

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

Je cartographié la manière attendue:

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); 
    } 
} 

Si j'utilise cette version, je reçois chaque deuxième caractère de la chaîne dans mon omble chevalier [] ("aits D" pour "Macintosh HD".) Je suppose que cela a quelque chose à voir avec être sur une plate-forme 64 bits et JNA mappant la valeur sur un wchar_t 32 bits mais en coupant les 16 bits élevés sur chaque wchar_t en les recopiant. Si j'utilise la version de byte [], j'obtiens des données qui décodent correctement en utilisant le jeu de caractères UTF-16LE. Si j'utilise la version UInt16 [], j'obtiens le bon point de code pour chaque caractère, mais il est alors incommode de les reconvertir en une chaîne.

Existe-t-il un moyen de définir mon type en tant que char [], tout en le convertissant correctement?

Répondre

0

Je ne pense pas fondamentalement car un char est une séquence d'octets décodés.

C'est pourquoi votre version d'octets fonctionne comme un charme avec le décodage manuel

Si vous voulez coller avec caractères Je suggère que:

  • vous accrochez JNA avec un décodeur
  • ou convertir votre forme numérique des caractères de l'UTF-16LE vous obtenez au jeu de caractères JVM interne qui est unicode

Malheur. Je ne connais pas un moyen facile de faire l'un des deux.

Mon avis: coller avec le byte[] verion


D'ailleurs comment avez-vous créé votre classe UInt16?