1

我正在研究 Okio 的源代码,以便更好地理解有效的字节传输,并作为一个玩具示例做了一点ForwardingSource,它会在单个字节出现时反转它们。例如,它将 (unsigned) 转换0b1011为 (unsigned) 0b0100

class ByteInvertingSource(source: Source) : ForwardingSource(source) {

  // temporarily stores incoming bytes
  private val sourceBuffer: Buffer = Buffer()

  override fun read(sink: Buffer, byteCount: Long): Long {
    // read incoming bytes
    val count = delegate.read(sourceBuffer, byteCount)

    // write inverted bytes to sink
    sink.write(
      sourceBuffer.readByteArray().apply {
        println("Converting: ${joinToString(",") { it.toString(2) }}")
        forEachIndexed { index, byte -> this[index] = byte.inv() }
        println("Converted : ${joinToString(",") { it.toString(2) }}")
      }
    )
    return count
  }
}

这是最佳代码吗?

具体来说:

  • 我真的需要该sourceBuffer字段,还是可以使用其他技巧直接转换字节?
  • 从中读取单个字节sourceBuffer并将单个字节写入其中是否更有效sink?(我找不到write(Byte)方法,所以也许这是一个线索,它不是。)
4

0 回答 0