我从TCP服务器收到ByteString
的数据。消息以最后一个字节为0x03结束。对于我收到的每个ByteString
,我需要检查最后一个字节是否为0x03。现在我打电话给lastIndexof
。
val data : ByteString = ...
if (data.lastIndexOf(0x03) >= 0) {}
但这是低效的,因为对于大多数消息块,它将无缘无故地遍历所有字节。有没有办法反向迭代字节?
答案 0 :(得分:1)
由于ByteString
是Seq
,您可以
if (data.last == 0x03) {}
但我不知道它是如何实现的,所以我不能保证它不会遍及整个事情。
答案 1 :(得分:1)
ByteString
是IndexedSeq
,因此在恒定或接近恒定的时间内,您应该可以执行以下操作:
val terminated = data.lastOption.filter(_ == 0x03).getOrElse(false)
在幕后,这将使用apply
方法来获取长度为1的元素。 length
和apply
都应根据IndexedSeq
文档以恒定或接近恒定的时间执行。
Indexed sequences support constant-time or near constant-time element access and length computation