初始化ByteArrayOutputStream?

时间:2014-11-02 13:27:47

标签: java bytearray mqtt bytearrayoutputstream android-open-accessory

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

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

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());
}

1 个答案:

答案 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