如何将以下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端用一些代码修复它。
答案 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];