0

我是MQTTAndroid Open Accessory "AOA"的新手。在閱讀教程時我意識到,在嘗試寫入ByteArrayOutputStream類型的變量之前,應該先將00x00寫入該變量。初始化ByteArrayOutputStream?

這是一種初始化嗎?下面是一個例子:

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

回答

2

這不是由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 
+0

謝謝fr下answe,但請讓我知道,爲什麼右移用於隨後並且通過0xFF – user2121 2014-11-02 14:06:29

+1

'長度>> 8'的擦除通過將數字向下移動來寫入高字節b y 8位,使得位置8至15的位現在位於位0至位7中。位於位置0至7的位被移除。 (對於正數,這相當於將數字除以2的8次冪,即256)。對於較低長度的字節,位0至7已經位於想要的位置,但我們需要關閉其他位的數字,這是通過與0xFF進行AND操作完成的,0xFF是僅設置了位0到7的數字。 – Boann 2014-11-02 14:12:30

+0

謝謝。我有另一個問題涉及到同一主題,請看看如果你不介意http://stackoverflow.com/questions/26689636/regarding-the-mqtt-fixed-header-structure – user2121 2014-11-02 14:22:27