gpt4 book ai didi

java - 初始化 ByteArrayOutputStream?

转载 作者:行者123 更新时间:2023-12-02 05:18:33 26 4
gpt4 key购买 nike

我是 MQTTAndroid 开放附件“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 协议(protocol)有意义。我不太熟悉,快速浏览一下MQTT protocol specification显示字符串是通过以 UTF-8 写入字符串字节进行编码的,以 2 字节长度字段为前缀,高字节在前。

在您给出的两个示例中,都正在写入字符串,但它只写入一个长度的字节。那么,0 字节必须是另一个长度字节。我确信就是这样。该代码有点草率:它假设您的情况中的字符串长度小于 256 个字节,因此它始终可以假设最大长度字节为 0。

如果“协议(protocol)名称”有可能为 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

关于java - 初始化 ByteArrayOutputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26699782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com