0

我是MQTTAndroid Open Accessory "AOA"的新手。在阅读教程时我意识到,在尝试写入ByteArrayOutputStream类型的变量之前,应该先将00x00写入该变量。初始化ByteArrayOutputStream?

这是一种初始化吗?下面是一个例子:

EX_1

variableHeader.write(0x00); 
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length); 
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8")); 

EX_2

public static byte[] connect() throws UnsupportedEncodingException, IOException { 
    String identifier = "android"; 
    ByteArrayOutputStream payload = new ByteArrayOutputStream(); 
    payload.write(0); 
    payload.write(identifier.length()); 
} 

回答

2

这不是由ByteArrayOutputStream所需的任何类型的初始化。调用write(0)只需在字节数组中插入一个0字节作为第一个字节。

相反,该字节必须对MQTT协议有意义。我不熟悉它,但快速查看MQTT protocol specification,发现字符串是通过以UTF-8编写字符串字节进行编码的,其前缀为2字节长度字段,高字节在前。

在这两个例子中,字符串正在写入,但它只写一个长度字节。那么0字节必须是另一个长度字节。我确定这就是它。代码有点草率:假定你的情况下的字符串长度小于256字节,所以它始终可以假定上面的长度字节为0.

如果有任何“协议名称”存在的可能性256个字节或更长的时间,那么正确的方式来写这个代码:

variableHeader.write(0x00); 
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length); 
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8")); 

是:

byte[] stringBytes = PROTOCOL_NAME.getBytes("UTF-8"); 
variableHeader.write(stringBytes.length >> 8); // upper length byte 
variableHeader.write(stringBytes.length & 0xFF); // lower length byte 
variableHeader.write(stringBytes); // actual data 
+0

谢谢fr下answe,但请让我知道,为什么右移用于随后并且通过0xFF – user2121 2014-11-02 14:06:29

+1

'长度>> 8'的擦除通过将数字向下移动来写入高字节b y 8位,使得位置8至15的位现在位于位0至位7中。位于位置0至7的位被移除。 (对于正数,这相当于将数字除以2的8次幂,即256)。对于较低长度的字节,位0至7已经位于想要的位置,但我们需要关闭其他位的数字,这是通过与0xFF进行AND操作完成的,0xFF是仅设置了位0到7的数字。 – Boann 2014-11-02 14:12:30

+0

谢谢。我有另一个问题涉及到同一主题,请看看如果你不介意http://stackoverflow.com/questions/26689636/regarding-the-mqtt-fixed-header-structure – user2121 2014-11-02 14:22:27