我是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());
}
答案 0 :(得分: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