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

标签 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 端用一些代码修复了它。

最佳答案

每当您要处理某些二进制通信协议(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/

相关文章:

c++ - 为什么重载继承的静态函数不明确?

c++ - 程序只有在我在 Visual Studio 中运行时才会执行

c++ - C复制3维数组

java - 登录 https 网站并仅使用核心 Java API 下载页面

java - 如何将混响效果附加到 AudioRecord/PCM 数据并将其保存到文件中?

java - 为什么 sql 命令没有正确结束被抛出?

c++ - 隐藏从 (C++) 隐式派生的子类中的方法

java - 如何使SearchView与RecyclerView相同?

c - 在 C 中对数组进行排序

java - AtomicReference 的各个元素上的数据争用