首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化ByteArrayOutputStream?

初始化ByteArrayOutputStream?
EN

Stack Overflow用户
提问于 2014-11-02 13:27:46
回答 1查看 2.2K关注 0票数 0

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

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

EX_1

代码语言:javascript
复制
variableHeader.write(0x00);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8"));

EX_2

代码语言:javascript
复制
public static byte[] connect() throws UnsupportedEncodingException, IOException {
   String identifier = "android";
   ByteArrayOutputStream payload = new ByteArrayOutputStream();
   payload.write(0);
   payload.write(identifier.length());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-02 13:55:29

这不是ByteArrayOutputStream所需要的任何初始化。调用write(0)只需插入一个0字节作为字节数组中的第一个字节。

相反,字节必须对MQTT协议有意义。我对它并不熟悉,但是快速查看一下MQTT协议规范就会发现,字符串是通过在UTF-8中写入字符串字节来编码的,该字段以2字节长度字段为前缀,以上字节开头。

在您给出的两个示例中,字符串都是正在编写的,但它只写了一个长度字节。那么,0字节必须是另一个长度字节。我敢肯定就是这样。代码有点草率:它假定在您的情况下字符串的长度小于256字节,因此它总是可以假定上长度字节为0。

如果存在任何“协议名称”为256字节或更长的可能性,那么编写此代码的正确方法是:

代码语言:javascript
复制
variableHeader.write(0x00);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8").length);
variableHeader.write(PROTOCOL_NAME.getBytes("UTF-8"));

将是:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26699782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档