如何将以下 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 端用一些代码修复了它。
最佳答案
每当您要处理某些二进制通信协议(protocol)时,无论是 TCP 连接、串行端口、USB 等,您都需要为自己省去一些 future 的麻烦,并定义您的协议(protocol)。
具体来说,这意味着字段宽度和 byte order 。当通过网络协议(protocol)发送二进制数据时,我们几乎总是按照“网络顺序”发送它,即“大端”,意思是最高有效字节在前。
示例:我想通过网络发送一个四字节的int a = 0x12345678
。如果操作正确,字节将按 12 34 56 78
的顺序输出。
但是,我相信您的 ATMEGA 芯片是小端字节序的,这意味着字节存储(在内存中)时最低有效字节在前。因此,如果您只是将 int
转换为 unsigned char*
并发送 4 个字节,它们将按 78 56 34 12
的顺序输出>.
因此,为了将该值发送出去,您应该首先决定它的字节数。由于您已将它限制在 0 - 1023 的范围内,因此您发现它只适合两个字节。好的。所以你的协议(protocol)是:
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 方面对您有所帮助:
关于java - C++/Java - int(0 - 1023) 到字节数组(仅限两个字节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22444454/