【问题标题】:Initializing ByteArrayOutputStream?初始化 ByteArrayOutputStream?
【发布时间】:2014-11-02 21:55:29
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的回答,但请告诉我,为什么使用右移后跟 And peration over 0xFF
    • length >> 8 通过将数字向下移动 8 位来写入高字节,因此从位置 8 到 15 的位现在位于位 0 到 7 的位置。位于位置的位0 到 7 被删除。 (对于正数,这相当于将数字除以 2 的 8 次方;即 256。)对于较低长度的字节,位 0 到 7 已经在想要的位置,但我们需要关闭其他位数字,这是通过与 0xFF 进行与运算来完成的,0xFF 是一个只设置了 0 到 7 位的数字。
    • 谢谢。我有另一个与同一主题相关的问题,如果您不介意请看一下stackoverflow.com/questions/26689636/…
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多