2016-01-21 42 views
0

我從TCP服務器接收數據爲ByteString。消息以最後一個字節爲0x03結束。對於我收到的每個ByteString我需要檢查最後一個字節是否爲0x03。現在我打電話給lastIndexof反向重複Akka字節串

val data : ByteString = ... 

if (data.lastIndexOf(0x03) >= 0) {} 

但是這是低效率的,因爲對於大多數消息塊它將遍歷所有字節,沒有很好的理由。有什麼方法可以通過反向字節來遍歷嗎?

回答

1

一個ByteStringIndexedSeq,所以在恆定或接近恆定的時候,你應該能夠做這樣的事情:

val terminated = data.lastOption.filter(_ == 0x03).getOrElse(false) 

引擎蓋下,這是要使用apply方法來獲取長度 - 1個元素。根據IndexedSeq文檔,lengthapply應該在恆定或接近恆定的時間內執行。

Indexed sequences support constant-time or near constant-time element access and length computation 
1

由於ByteStringSeq你可以做

if (data.last == 0x03) {} 

,但我不它是如何實現的,所以我不能保證它不遍歷整個事情反正。

+0

謝謝,這將工作。然而,cmbaxter的答案更爲通用,在其他問題領域會更好地爲我服務。所以我接受那一個。 – RajV