C ++ / Java - int(0 - 1023)到字节数组(仅限两个字节)

时间:2014-03-16 23:19:47

标签: java c++ arrays

如何将以下int添加到字节数组中。我一直在阅读其他SO问题,一切都令人困惑,有人可以探讨代码中发生的事情。

int val = 1023; // the int will vary from 0 to 1023 (it's the analogRead value from an Arduino board)

我希望将其作为字节数组的目的是让我可以将它用于Arduino的server.write()。

这是我到目前为止所提出的:

  int val = analogRead(A0);
  Serial.println(val);
  byte value[2];
  value[1] = val & 0x000000ff;
  value[0] = (val & 0x0000ff00) >> 8;
  server.write(value[0]);
  server.write(value[1]);

我正在尝试与我编写的Android应用程序进行TCP通信,这是接收端:

mmInStream = mmSocket.getInputStream();
final byte[] buffer = new byte[16384]; // two bytes
int bytes;
bytes = mmInStream.read(buffer);
Log.d(null,buffer[0]+buffer[1]);

这是正确的吗?

Arduino控制台正在吐出值,例如:

870
870
870
872

但是我的Android应用程序正在吐出以下内容,例如:

3102
3105
1033
1035

我一定是在做错了!

答案:Arduino发送无符号字节,java只收到有符号字节。我在java端用一些代码修复它。

2 个答案:

答案 0 :(得分:1)

无论何时你要处理一些二进制通信协议,无论是TCP连接,串行端口,USB等,你都需要为自己节省一些未来的麻烦并定义你的协议

具体来说,这意味着字段宽度和byte order。当通过网络协议发送二进制数据时,我们几乎总是以“网络顺序”发送它,这是“big-endian”,这意味着最重要的字节。

示例:我想通过网络发送一个四字节int a = 0x12345678。如果您正确执行此操作,则字节将按12 34 56 78

的顺序排出

但是,我相信你的ATMEGA芯片是小端的,这意味着字节存储(在内存中),首先是最低有效字节。因此,如果您只是将int转换为unsigned char*并发送4个字节,它们将按照78 56 34 12的顺序发出。

因此,为了发送该值,您应该首先确定它将是多少字节。由于您已将其限制在0 - 1023范围内,因此您发现它只能容纳两个字节。好。所以你的协议是:

Offset 0:  value   Size: 2

现在,您需要以网络订单发送它。您的示例代码:

byte value [2];
value[1] = val & 0x000000ff;
value[0] = (val & 0x0000ff00) >> 8;

将最高有效字节置于位置0,将最低有效字节置于位置1.因此,值0x1234将按12 34的顺序出现。完美。

您的代码是正确的(在Arduino方面)。


现在,在接收方,您需要确保您还以网络顺序接收数据。我没有做过任何Java网络编程,因此您需要查看文档以了解它如何处理网络二进制流。特别是,当您从网络中读取“16位无符号整数”时,需要遵守字节顺序。

也许这对Java方面有所帮助:

答案 1 :(得分:0)

这会将int编码为字节数组。

// Encoding
byte value[2] = { highByte(val), lowByte(val) };

这会将字节数组转换回整数

// Decoding
int val = value[0] << 8 + value[1];