commit 985e1ac75404cb0a62068101b579cd86016791e6
parent 853580f2f6084e66df2f24c655a54fd26199f458
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Tue, 19 Mar 2024 23:04:01 +0100
fix: proto pretty print
Diffstat:
2 files changed, 35 insertions(+), 36 deletions(-)
diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/util/protobuf/ProtoEditor.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/util/protobuf/ProtoEditor.kt
@@ -18,7 +18,7 @@ class EditorContext(
fun add(id: Int, content: ProtoWriter.() -> Unit) = addBuffer(id, ProtoWriter().apply(content).toByteArray())
fun addString(id: Int, value: String) = addBuffer(id, value.toByteArray())
fun addFixed64(id: Int, value: Long) = addWire(Wire(id, WireType.FIXED64, value))
- fun addFixed32(id: Int, value: Int) = addWire(Wire(id, WireType.FIXED32, value))
+ fun addFixed32(id: Int, value: Float) = addWire(Wire(id, WireType.FIXED32, value.toRawBits()))
fun firstOrNull(id: Int) = wires[id]?.firstOrNull()
fun getOrNull(id: Int) = wires[id]
@@ -50,6 +50,12 @@ class EditorContext(
wires.clear()
wires.addAll(newWires)
}
+
+ override fun toString(): String {
+ return ProtoWriter().apply {
+ wires.values.flatten().forEach { addWire(it) }
+ }.toByteArray().let { ProtoReader(it).toString() }
+ }
}
class ProtoEditor(
diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/util/protobuf/ProtoReader.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/util/protobuf/ProtoReader.kt
@@ -1,5 +1,6 @@
package me.rhunk.snapenhance.common.util.protobuf
+import java.nio.ByteBuffer
import java.util.UUID
data class Wire(val id: Int, val type: WireType, val value: Any) {
@@ -180,50 +181,24 @@ class ProtoReader(private val buffer: ByteArray) {
private fun prettyPrint(tabSize: Int): String {
val tabLine = " ".repeat(tabSize)
val stringBuilder = StringBuilder()
- values.forEach { (id, wires) ->
+ values.forEach v@{ (id, wires) ->
wires.forEach { wire ->
stringBuilder.append(tabLine)
stringBuilder.append("$id <${wire.type.name.lowercase()}> = ")
when (wire.type) {
WireType.VARINT -> stringBuilder.append("${wire.value}\n")
WireType.FIXED64, WireType.FIXED32 -> {
- //print as double, int, floating point
- val doubleValue = run {
- val bytes = wire.value as ByteArray
- var value = 0L
- for (i in bytes.indices) {
- value = value or ((bytes[i].toLong() and 0xFF) shl (i * 8))
- }
- value
- }.let {
- if (wire.type == WireType.FIXED32) {
- it.toInt()
- } else {
- it
- }
- }
-
- stringBuilder.append("$doubleValue/${doubleValue.toDouble().toBits().toString(16)}\n")
+ val byteBuffer = ByteBuffer.wrap(wire.value as ByteArray).order(java.nio.ByteOrder.LITTLE_ENDIAN)
+ val hexValue = wire.value.joinToString("") { byte -> "%02x".format(byte) }
+ val intValue = if (wire.type == WireType.FIXED32) byteBuffer.int else byteBuffer.long
+ byteBuffer.position(0)
+ val decimalValue = if (wire.type == WireType.FIXED32) byteBuffer.float else byteBuffer.double
+ stringBuilder.append("$intValue/0x$hexValue/$decimalValue\n")
}
WireType.CHUNK -> {
- fun printArray() {
- stringBuilder.append("\n")
- stringBuilder.append("$tabLine ")
- stringBuilder.append((wire.value as ByteArray).joinToString(" ") { byte -> "%02x".format(byte) })
- stringBuilder.append("\n")
- }
- runCatching {
- val array = (wire.value as ByteArray)
- if (array.isEmpty()) {
- stringBuilder.append("empty\n")
- return@runCatching
- }
- //auto detect ascii strings
- if (array.all { it in (0x20..0x7E) || it == 0x0A.toByte() || it == 0x0D.toByte() }) {
- stringBuilder.append("string: ${array.toString(Charsets.UTF_8)}\n")
- return@runCatching
- }
+ val array = (wire.value as? ByteArray) ?: return@forEach
+ fun printArray() {
// auto detect uuids
if (array.size == 16) {
val longs = LongArray(2)
@@ -234,6 +209,24 @@ class ProtoReader(private val buffer: ByteArray) {
longs[1] = longs[1] or ((array[i].toLong() and 0xFF) shl ((15 - i) * 8))
}
stringBuilder.append("uuid: ${UUID(longs[0], longs[1])}\n")
+ return
+ }
+
+ //auto detect ascii strings
+ if (array.all { it in (0x20..0x7E) || it == 0x0A.toByte() || it == 0x0D.toByte() }) {
+ stringBuilder.append("string: ${array.toString(Charsets.UTF_8)}\n")
+ return
+ }
+
+ stringBuilder.append("\n")
+ stringBuilder.append("$tabLine ")
+ stringBuilder.append(array.joinToString(" ") { byte -> "%02x".format(byte) })
+ stringBuilder.append("\n")
+ }
+
+ runCatching {
+ if (array.isEmpty()) {
+ stringBuilder.append("empty\n")
return@runCatching
}