我是MQTT和Android Open Accessory "AOA"的新手。在阅读教程时,我意识到,在尝试写入类型为ByteArrayOutputStream的变量之前,首先应该将0或0x00写入该变量。
这是某种初始化吗?以下是这方面的一个例子:
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());
}发布于 2014-11-02 13:55:29
这不是ByteArrayOutputStream所需要的任何初始化。调用write(0)只需插入一个0字节作为字节数组中的第一个字节。
相反,字节必须对MQTT协议有意义。我对它并不熟悉,但是快速查看一下MQTT协议规范就会发现,字符串是通过在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 datahttps://stackoverflow.com/questions/26699782
复制相似问题