【问题标题】:C union of integer to bytes read by Java and reconverted to Java int整数到 Java 读取的字节的 C 联合并重新转换为 Java int
【发布时间】:2014-08-07 13:46:40
【问题描述】:

我想用 C 在串行线路上发送一个编码为字节数组的整数,然后使用 java 接收它并将数组放回 java int。

我正在使用 rs-232 发送由 C 联合打包的字节数组中的四个字节。 (有点奇怪的 typedef 是由 Arduino C 方言引起的) 这里我发送例如十进制值 600 它被相应地包装在一个类型中:

typedef union {
  uint16_t integer;
  byte binary[4];
} binaryInteger;

并使用函数发送:

void mcProxySend(binaryInteger bi){
  for (byte i = 0; i < 4 ; i ++) {
    mcProxySend(bi.binary[i]);
  } 
}

mcProxySend 只是一个带有偶尔转义字符的串行写入。

我已经解决了我的 Java 类的接收端。数据在流动,一点一点的和我发送的一样。

我的问题是如何重新组装分解的整数。

【问题讨论】:

    标签: java c arrays


    【解决方案1】:

    由于我在写这个问题的同时找到了答案,所以我将发布我的解决方案。

    dec 6000 的值是 bin 1011101110000 并通过联合将其拆分为

    b[0] = 0 //(MSB) 
    b[1] = 0
    b[2] = 10111
    b[3] = 1110000 //(LSB)
    

    this thread 中的答案类似,解决方案是将二进制值移位到新整数。这将重新创建原始字节结构,假设它们具有相同的位长。

    【讨论】:

      【解决方案2】:

      您应该在接收方使用相同的联合(考虑可能的字节顺序交换),然后将接收字节写入b 字段,一旦您拥有所有四个,只需从integer 中提取结果值字段。

      哦,接收器是 Java - 没关系!

      【讨论】:

      • 如果接收者是 C,答案会很简单,不是吗。如果最近像 Java 8 一样在 Java 中添加了联合的概念,请告诉我,我可能错过了。
      • 是的,就是这么简单,这就是为什么我将答案留给后代(作为“社区维基”)而不是仅仅删除它。
      【解决方案3】:

      假设大端字节序,Java 在 java.io.Bits.getInt(byteArray, offset) 中有一个函数。遗憾的是,它没有被公开。但是它的实现很容易被用来学习。

      这是它的实现,它只是将每个字节提升为一个 int,将其滑动到正确的位置,然后将值位和在一起。

      static int getInt(byte[] b, int off) {
          return ((b[off + 3] & 0xFF)      ) +
                 ((b[off + 2] & 0xFF) <<  8) +
                 ((b[off + 1] & 0xFF) << 16) +
                 ((b[off    ]       ) << 24);
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 2016-04-22
        • 1970-01-01
        • 2014-12-27
        • 2011-09-16
        • 2013-08-14
        相关资源
        最近更新 更多