0

我是MQTTand的新手Android Open Accessory "AOA"。在阅读教程时,我意识到,在尝试写入该类型的变量之前ByteArrayOutputStream0或者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());
}
4

1 回答 1

2

这不是 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 data
于 2014-11-02T13:55:29.537 回答