繁体   English   中英

初始化ByteArrayOutputStream吗?

[英]Initializing ByteArrayOutputStream?

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

这不是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM