【问题标题】:passing an integer with "|" sign using java用“|”传递一个整数使用java签名
【发布时间】:2016-01-27 06:14:43
【问题描述】:

我有一个 C 代码,其中包含以下行。

ipj_set_value(&iri_device,E_IPJ_KEY_REPORT_CONTROL_TAG,E_IPJ_TAG_FLAG_BIT_EPC | E_IPJ_TAG_FLAG_BIT_TID |E_IPJ_TAG_FLAG_BIT_TIMESTAMP | E_IPJ_TAG_FLAG_BIT_CHANNEL);

我正在使用 JNA 从 Java 调用此设置值方法。我如何在 Java 中做同样的事情?那就是我想使用“|”传递许多整数符号。这在此处用作“或”。下面是我上面用到的方法定义和变量。

ipj_error ipj_set_value(
    ipj_iri_device *iri_device, /**< [in] IRI device data structure */
    ipj_key         key,        /**< [in] Key code to set*/
    uint32_t        value)      /**< [in] Value to set */
 {
    return ipj_set(iri_device, key, 0, 0, value);
 }

#define E_IPJ_TAG_FLAG_BIT_EPC       ((ipj_tag_flag)(0x1))
#define E_IPJ_TAG_FLAG_BIT_TID       ((ipj_tag_flag)(0x2))
#define E_IPJ_TAG_FLAG_BIT_TIMESTAMP ((ipj_tag_flag)(0x20))
#define E_IPJ_TAG_FLAG_BIT_CHANNEL   ((ipj_tag_flag)(0x100))

【问题讨论】:

  • 一样吗?你试过了吗?
  • 是的。尝试将“1|64”转换为 int 格式时出现数字格式异常。我从我的 websocket 客户端得到这个字符串。
  • 你需要将它作为字符串传递
  • @VD' 我的方法声明应该等同于 C 代码的声明。它期望一个整数参数。所以不能将其作为字符串传递
  • 当然,“1|64”不是一个有效的整数。不是在 C 中,不是在 Java 中。如果您确实允许您的 Javascript 客户端确定此值,那么您应该在 Javascript 中评估此表达式“1|64”并将结果值 (65) 传递给 Java。

标签: java methods parameters int jna


【解决方案1】:

即使您已经接受了答案。我认为值得纠正。

| 是逻辑 OR 运算符。这些值未添加。它将执行按位 OR 操作(请参阅:Wikipedia)。

一个小例子sn-p。

static final int E_IPJ_TAG_FLAG_BIT_EPC = 1;
static final int E_IPJ_TAG_FLAG_BIT_TID = 2;

public static void main(String[] args) throws Exception {
    StringBuilder sb = new StringBuilder("00000000");
    sb.append(Integer.toBinaryString(E_IPJ_TAG_FLAG_BIT_EPC));
    System.out.println("E_IPJ_TAG_FLAG_BIT_EPC: " + sb.substring(sb.length()-8));

    sb.delete(8, sb.length());
    sb.append(Integer.toBinaryString(E_IPJ_TAG_FLAG_BIT_TID));
    System.out.println("E_IPJ_TAG_FLAG_BIT_TID: " + sb.substring(sb.length()-8));

    int orEd = E_IPJ_TAG_FLAG_BIT_EPC | E_IPJ_TAG_FLAG_BIT_TID;
    sb.delete(8, sb.length());
    sb.append(Integer.toBinaryString(orEd));
    System.out.println("bitwise OR            : " + sb.substring(sb.length()-8));
}

输出

E_IPJ_TAG_FLAG_BIT_EPC: 00000001
E_IPJ_TAG_FLAG_BIT_TID: 00000010
bitwise OR            : 00000011

如果| 意味着添加值,那么E_IPJ_TAG_FLAG_BIT_EPC | E_IPJ_TAG_FLAG_BIT_EPC 将是00000010。因为它是按位或结果仍然是00000001

【讨论】:

    【解决方案2】:

    Java 有一个按位或运算符,就像 C:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

    您应该能够像在 C 中一样编写代码。

    【讨论】:

    • 我从 websocket 客户端接收到这个“1|64”作为整数。所以当我将它转换为 int 时,我得到一个数字格式异常。
    • @mayooran 那么这在 C 中是如何工作的呢? 不会。 websocket 客户端发送了错误的数据,因为它应该发送65,而不是1|64
    【解决方案3】:

    当你使用两个整数结合“|”你实际上是在添加它们。因此获取字符串拆分并进行加法并传递附加值

    【讨论】:

    • |不是整数加法,而是按位或
    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多