【问题标题】:C++/Java - int(0 - 1023) to byte Array (two bytes only)C++/Java - int(0 - 1023) 到字节数组(仅两个字节)
【发布时间】:2014-03-19 04:17:15
【问题描述】:

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

【问题讨论】:

  • 是的,这很好,也是一种很好的做事方式。您可以从十六进制常量中删除前导零。
  • @MattMcNabb 但是,由于他正在处理一个 4 字节的 int,因此它肯定清楚地表明了他正在使用哪些字节。就个人而言,我喜欢它带有前导零 - 它显示了整个宽度。
  • Log.d(null,buffer[0]+buffer[1]); 行是否先将缓冲区[0] 转换为字符串?如果没有,你将字节加在一起,结果弄乱了

标签: java c++ arrays


【解决方案1】:

每当您要处理一些二进制通信协议时,无论是 TCP 连接、串行端口、USB 等。您需要为自己省去一些未来的麻烦并定义您的协议。

具体来说,这意味着字段宽度和byte order。通过网络协议发送二进制数据时,我们几乎总是按照“网络顺序”发送,即“大端”,即最高有效字节在前。

示例:我想通过网络发送一个四字节的int a = 0x12345678。如果操作正确,字节会按12 34 56 78 的顺序输出。

但是,我相信您的 ATMEGA 芯片是 little-endian,这意味着字节以最低有效字节在前存储(在内存中)。因此,如果您只是将 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 方面有所帮助:

【讨论】:

  • 我正在使用 TCP,接收端是 Java,具有以下内容:final byte[] buffer = new byte[16384];整数字节; bytes = mmInStream.read(buffer);
  • 感谢您的清晰工作!我已经用更多代码更新了我的问题!
  • mmInStream 是什么?
  • mmInStream 是:mmInStream = mmSocket.getInputStream();
  • 整体建议:将您的问题分为两部分:网络通信和 DAC 值。让他们独立工作并充分理解,然后尝试将它们组合在一起。调试网络协议已经够难了——你也不需要增加随机/变化值的复杂性!
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多