Open
Description
While edge case, Zipkin's primary representation of bytes is hex (even if they are transmitted in proto as raw bytes). It helps performance wise to be able to parse into a hex string (likely other way, too)
ex
// stolen from okio
private val HEX_DIGITS =
charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
@Suppress("NOTHING_TO_INLINE")
internal inline fun hex(data: BufferedSource, byteCount: Int): String {
val result = CharArray(byteCount * 2)
var i = 0
while (i < result.size) {
val b = data.readByte().toInt();
result[i++] = HEX_DIGITS[b shr 4 and 0xf]
result[i++] = HEX_DIGITS[b and 0xf] // ktlint-disable no-multi-spaces
}
return String(result)
}
/**
* Reads a `bytes` field value from the stream as a lower-hex string. The length is read from the
* stream prior to the actual data.
*/
@Throws(IOException::class)
fun readBytesAsHex(): String {
val byteCount = beforeLengthDelimitedScalar()
source.require(byteCount) // Throws EOFException if insufficient bytes are available.
return hex(source, byteCount.toInt())
}