的問題是,長度並不總是適合在7位(只能表示數字0到127用7位),在此情況下以下任一2或8個字節將被用於使長度配合:
- 126指的是下述2個字節用於長度
- 127指的是下述8字節用於長度
所以如果沒有編碼,有效負載從索引2,4或10開始。編碼時,它從6,8或14開始(因爲有4個掩碼字節)。
我以前發佈some pseudocode關於解碼有效載荷數據。
實際得到的長度爲「實數」(而不是單獨的字節),你可以使用按位移位運算如下(如果有兩個字節長度):
var length = (bytes[2] << 8) | (bytes[3] << 0);
這將計算的話是這樣的:
假設:
bytes[2]
是01101001
(105
在基座10)
bytes[3]
是10100101
(165
在基座10)
然後<<
會做:
01101001 00000000 // moved 8 places to the left, filled with zeroes
10100101 // moved 0 places (nothing really happening, you can eliminate '<< 0')
|
基本上將它們相加:
01101001 00000000
10100101
----------------- |
01101001 10100101 (in base 10 that's 27045)
所以,如果你有字節105
和165
,那麼它們代表的長度爲27045
。
偉大的鏈接,另一個問題,我怎麼知道要讀多少字節?因爲我不知道websocket的「框架」的大小,在java中,我正在閱讀使用「dataInputStream.read(bytes,totalToRead,leftToRead)...任何想法???完全失去......謝謝一個收益! – Andres
@Andres:我不知道Java,但正如我所說的框架包括長度。在我發佈的三種情況下,你可以得到的長度與第二個字節(最後7位),第三個和第四個字節或第三個到第十個字節 – pimvdb
@Andres:如果您不知道如何解釋字節並將它們轉換爲長度,請查看我的編輯。 – pimvdb