Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/Java-int(0-1023)到字节数组(仅两个字节)_Java_C++_Arrays - Fatal编程技术网

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

C++/Java-int(0-1023)到字节数组(仅两个字节),java,c++,arrays,Java,C++,Arrays,如何将以下int值转换为字节数组。我一直在读其他的问题,所以一切都是混乱的,有人可以解释一下代码中发生了什么 int val = 1023; // the int will vary from 0 to 1023 (it's the analogRead value from an Arduino board) 我希望将其作为字节数组,以便将其用于Arduino的服务器。write() 这就是我到目前为止的想法: int val = analogRead(A0); Serial.pri

如何将以下int值转换为字节数组。我一直在读其他的问题,所以一切都是混乱的,有人可以解释一下代码中发生了什么

int val = 1023; // the int will vary from 0 to 1023 (it's the analogRead value from an Arduino board)
我希望将其作为字节数组,以便将其用于Arduino的服务器。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端的一点代码修复了它。

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

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

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

然而,我相信你的ATMEGA芯片是little endian,这意味着字节存储(在内存中)首先是最低有效字节。因此,如果您将
int
转换为
无符号字符*
并发送4个字节,它们将按
78 56 34 12
的顺序输出

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

偏移量0:值大小:2 现在,您需要按网络顺序发送它。您的示例代码:

byte value [2];
value[1] = val & 0x000000ff;
value[0] = (val & 0x0000ff00) >> 8;
将最高有效字节放在位置0,最低有效字节放在位置1。因此,0x1234的值将按
12 34
的顺序输出。太好了

您的代码是正确的(在Arduino端)


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

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


这将int编码为字节数组

// Encoding
byte value[2] = { highByte(val), lowByte(val) };
这将把字节数组转换回整数

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

int val=value[0]我正在使用TCP,接收端是Java,具有以下内容:最终字节[]缓冲区=新字节[16384];整数字节;字节=mmInStream.read(缓冲区);谢谢你的明确行动!我用更多的代码更新了我的问题!什么是
mmInStream
?mmInStream是:mmInStream=mmSocket.getInputStream();一条完整的建议:将问题分为两部分:网络通信和DAC值。让他们都独立工作,完全理解,然后试着把他们放在一起。调试网络协议已经够困难的了——你不需要增加随机/更改值的复杂性!是的,这很好,也是一种很好的做事方式。您可以从十六进制常量中删除前导零。@MattMcNabb然而,由于他处理的是一个4字节的
int
,因此它肯定能清楚地表明他在处理哪些字节。就我个人而言,我喜欢前导零-它显示全宽。行
Log.d(null,buffer[0]+buffer[1])首先将缓冲区[0]转换为字符串?如果不是,则将字节相加,结果会变得混乱