[英]Initializing ByteArrayOutputStream?
我是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());
}
这不是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.