【问题标题】:How to translate casting from C in java?java - 如何在Java中翻译C的转换?
【发布时间】:2012-08-02 11:47:45
【问题描述】:

鉴于以下 C 中的声明,我可以这样写

char tab[64];
(*(uint32_t*)(tab[0]));

换句话说,应用这种类型的演员(*(uint32_t*)

还有其他方法可以在java中实现这个来获取标签的地址吗?

非常感谢

【问题讨论】:

  • 你甚至不能在 C 中可靠地做到这一点。发布的 sn-p 不会“获取 tab 的地址”。
  • Java 不允许程序员查看地址,所有这些都是在后台处理的。因此,以 Java 思维方式考虑地址并不是很有效率。
  • 这不是有效的 C 代码。
  • 最终想要达到什么目标?
  • @BrianAgnew -- 见stackoverflow.com/questions/11759053/…。也不是说那个线程是可以理解的,但它似乎导致了这个。

标签: java c reference casting


【解决方案1】:

Java 语言不支持使用指针(算术等)的直接操作。因此,让开发人员直接使用指针是不合理的。

【讨论】:

    【解决方案2】:

    还有其他方法可以在java中实现这个来获取标签的地址吗?

    没有。

    在 Java 中,long[]int[] 是根本不同的类型,您不能假装一个是另一个,反之亦然。

    简单的解决方案是使用移位和屏蔽来提取各个long 值的高32 位和低32 位部分。

    另一种选择可能是将 long 数组包装在 LongBuffer 中,然后创建一个 IntegerBuffer view。但这(IMO)很麻烦,实际上只是隐藏了在幕后进行的转移/掩蔽。


    评论指出,问题实际上是关于将字节数组视为指针数组。

    这也不可能......而且没有明智的解决方法。标准 Java 不允许您将位模式转换为指针,反之亦然。 (您可以使用一些技巧来做到这一点,但它们从根本上是不安全的,如果您没有完全正确地使用它们,它们很可能会导致您的 JVM 崩溃。)

    无论你想要实现什么,你都应该找到一种不同的方式来用 Java 编写代码。

    【讨论】:

    • 如果你看一下海报的代码,你会发现他的 char 数组被用来保存 uint32_t 指针...... long 和 int 如何应用?再多的屏蔽和移位都不允许您在 Java 中派生指针。
    【解决方案3】:

    您需要使用移位和掩码构造 32 位 int。

    【讨论】:

    • 我肯定希望看到您包含与所问问题相关的示例,或者删除您的答案。也许只是我很密集,但是您的答案似乎与使用显然是指针的 C 整数数组并将其迁移到 Java 无关。
    • 答案很好,如果问题打算将字节转换为整数。但是,提供的 C 代码仅在 char 的大小与 uint32_t* 相同并且实际上指向一个整数时才有效,所有这些都不太可能发生。
    【解决方案4】:

    Java 中的引用不像 C 中的指针那样是被动的。对象的地址可以随时更改,因此如果 JVM 不知道值是引用,它就无法正确更新它。

    从字面上回答您的问题,您可以使用 Unsafe 类来执行此操作,但它仅在您对对象在内存中的布局感兴趣时才有用。更改值可能会导致 JVM 随机崩溃。

    还有其他方法可以在 java 中实现此功能以获取选项卡的地址吗?

    如果您查看为什么要尝试这样做,您可能会发现在 Java 中解决方案完全不同,根本不需要指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多