Mac OS X 上 UniChar 的正确 JNA 映射是什么?

发布于 2024-09-28 02:04:52 字数 897 浏览 2 评论 0原文

我有一个像这样的 C 结构:

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

如果我使用这个版本,我会将字符串的每个第二个字符放入我的 char[] (“aits D”代表“Macintosh HD”。)假设这与 64 位平台上的情况有关,JNA 将值映射到 32 位 wchar_t,然后在将它们复制回来时砍掉每个 wchar_t 上的高 16 位。

如果我使用 byte[] 版本,我将获得使用 UTF-16LE 字符集正确解码的数据。

如果我使用 UInt16[] 版本,我会为每个字符获得正确的代码点,但随后将它们转换回字符串会很不方便。

有什么方法可以将我的类型定义为 char[],并使其正确转换吗?

I have a C struct like this:

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

I have mapped this in the expected way:

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

If I use this version, I get every second character of the string into my char[] ("aits D" for "Macintosh HD".) I am assuming that this is something to do with being on a 64-bit platform and JNA mapping the value to a 32-bit wchar_t but then chopping off the high 16 bits on each wchar_t on copying them back.

If I use the byte[] version, I get data which decodes correctly using the UTF-16LE charset.

If I use the UInt16[] version, I get the right code point for each character but it is then inconvenient to convert them back into a string.

Is there some way I can define my type as char[], and yet have it convert correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

べ映画 2024-10-05 02:04:52

我不这么认为,基本上是因为 char 是解码的字节序列。

这就是为什么你的字节版本像手动解码一样工作

如果你想坚持使用字符,我建议:

  • 你用解码器挂钩 JNA
  • 或从你得到的 UTF-16LE 转换你的字符数字形式到内部 JVM 字符集,即 unicode

不幸的是,我不知道执行这两者中任何一个的简单方法。

我的意见:坚持使用 byte[] 版本


顺便问一下,您是如何创建 UInt16 类的?

I dont think so basically because a char is a decoded byte sequence.

That's why your byte version works like a charm with the manual decoding

If you want to stick with chars I suggest that:

  • you hook JNA with a decoder
  • or convert your chars numerical form from the UTF-16LE you get to the internal JVM charset which is unicode

Unfortunalty I don't know an easy way to do any of the two.

My opinion : stick with the byte[] verion


By the way how did you create your UInt16 class ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文