From 81d706300523c7f25779979bcaf2fad40e566c8b Mon Sep 17 00:00:00 2001 From: Robinson Date: Thu, 13 Jul 2023 01:39:54 +0200 Subject: [PATCH] Added support for byte-array hex conversion taking an upper limit --- LICENSE | 16 ++++----- src/dorkbox/bytes/HexExtensions.kt | 14 ++++---- test/dorkbox/bytes/TestHex.kt | 53 +++++++++++++++++++----------- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/LICENSE b/LICENSE index 4ec6168..082ec21 100644 --- a/LICENSE +++ b/LICENSE @@ -26,14 +26,6 @@ Andreas Schildbach ligi - - Kotlin - - [The Apache Software License, Version 2.0] - https://github.com/JetBrains/kotlin - Copyright 2020 - JetBrains s.r.o. and Kotlin Programming Language contributors - Kotlin Compiler, Test Data+Libraries, and Tools repository contain third-party code, to which different licenses may apply - See: https://github.com/JetBrains/kotlin/blob/master/license/README.md - - Netty - An event-driven asynchronous network application framework [The Apache Software License, Version 2.0] https://netty.io @@ -69,6 +61,14 @@ Copyright 2023 Lightweight Java Game Library + - Kotlin - + [The Apache Software License, Version 2.0] + https://github.com/JetBrains/kotlin + Copyright 2020 + JetBrains s.r.o. and Kotlin Programming Language contributors + Kotlin Compiler, Test Data+Libraries, and Tools repository contain third-party code, to which different licenses may apply + See: https://github.com/JetBrains/kotlin/blob/master/license/README.md + - Updates - Software Update Management [The Apache Software License, Version 2.0] https://git.dorkbox.com/dorkbox/Updates diff --git a/src/dorkbox/bytes/HexExtensions.kt b/src/dorkbox/bytes/HexExtensions.kt index 887610e..b1ade1e 100644 --- a/src/dorkbox/bytes/HexExtensions.kt +++ b/src/dorkbox/bytes/HexExtensions.kt @@ -76,11 +76,11 @@ object Hex { * Note that by default the 0x prefix is prepended to the result of the conversion. * If you want to have the representation without the 0x prefix, pass to this method an empty prefix. */ - fun encode(value: ByteArray, prefix: String = "0x", toUpperCase: Boolean = false): String { + fun encode(value: ByteArray, prefix: String = "0x", limit: Int = value.size, toUpperCase: Boolean = false): String { return if (toUpperCase) { - prefix + value.joinToString("") { encodeUpper(it) } + prefix + value.joinToString(separator = "", limit = limit, truncated = "") { encodeUpper(it) } } else { - prefix + value.joinToString("") { encode(it) } + prefix + value.joinToString(separator = "", limit = limit, truncated = "") { encode(it) } } } @@ -127,12 +127,12 @@ object Hex { * If you want to have the representation without the 0x prefix, use the [toNoPrefixHexString] method or * pass to this method an empty [prefix]. */ -fun ByteArray.toHexString(prefix: String = "0x", toUpperCase: Boolean = false): String = Hex.encode(this, prefix, toUpperCase) +fun ByteArray.toHexString(prefix: String = "0x", limit: Int = this.size, toUpperCase: Boolean = false): String = Hex.encode(this, prefix, limit, toUpperCase) /** * Converts [this] [ByteArray] into its hexadecimal representation without prepending any prefix to it. */ -fun ByteArray.toNoPrefixHexString(toUpperCase: Boolean = false): String = Hex.encode(this, "", toUpperCase) +fun ByteArray.toNoPrefixHexString(limit: Int = this.size, toUpperCase: Boolean = false): String = Hex.encode(this, "", limit, toUpperCase) /** @@ -142,12 +142,12 @@ fun ByteArray.toNoPrefixHexString(toUpperCase: Boolean = false): String = Hex.en * If you want to have the representation without the 0x prefix, use the [toNoPrefixHexString] method or * pass to this method an empty [prefix]. */ -fun Collection.toHexString(prefix: String = "0x"): String = Hex.encode(this.toByteArray(), prefix) +fun Collection.toHexString(prefix: String = "0x", limit: Int = this.size): String = Hex.encode(this.toByteArray(), prefix, limit) /** * Converts [this] [Collection] of bytes into its hexadecimal representation without prepending any prefix to it. */ -fun Collection.toNoPrefixHexString(): String = Hex.encode(this.toByteArray(), "") +fun Collection.toNoPrefixHexString(limit: Int = this.size): String = Hex.encode(this.toByteArray(), "", limit) /** diff --git a/test/dorkbox/bytes/TestHex.kt b/test/dorkbox/bytes/TestHex.kt index c0385f0..015560e 100644 --- a/test/dorkbox/bytes/TestHex.kt +++ b/test/dorkbox/bytes/TestHex.kt @@ -1,5 +1,5 @@ /* - * Copyright 2021 dorkbox, llc + * Copyright 2023 dorkbox, llc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,16 +23,16 @@ class TestHex { @Test fun weCanProduceSingleDigitHex() { - assertEquals(Hex.encode(0.toByte()), "00") - assertEquals(Hex.encode(1.toByte()), "01") - assertEquals(Hex.encode(15.toByte()), "0f") + assertEquals("00", Hex.encode(0.toByte())) + assertEquals("01", Hex.encode(1.toByte())) + assertEquals("0f", Hex.encode(15.toByte())) } @Test fun weCanProduceDoubleDigitHex() { - assertEquals(Hex.encode(16.toByte()), "10") - assertEquals(Hex.encode(42.toByte()), "2a") - assertEquals(Hex.encode(255.toByte()), "ff") + assertEquals("10", Hex.encode(16.toByte())) + assertEquals("2a", Hex.encode(42.toByte())) + assertEquals("ff", Hex.encode(255.toByte())) } @Test @@ -42,14 +42,29 @@ class TestHex { @Test fun sizesAreOk() { - assertEquals(Hex.decode("0x").size, 0) - assertEquals(Hex.decode("ff").size, 1) - assertEquals(Hex.decode("ffaa").size, 2) - assertEquals(Hex.decode("ffaabb").size, 3) - assertEquals(Hex.decode("ffaabb44").size, 4) - assertEquals(Hex.decode("0xffaabb4455").size, 5) - assertEquals(Hex.decode("0xffaabb445566").size, 6) - assertEquals(Hex.decode("ffaabb44556677").size, 7) + assertEquals(0, Hex.decode("0x").size) + assertEquals(1, Hex.decode("ff").size) + assertEquals(2, Hex.decode("ffaa").size) + assertEquals(3, Hex.decode("ffaabb").size) + assertEquals(4, Hex.decode("ffaabb44").size) + assertEquals(5, Hex.decode("0xffaabb4455").size) + assertEquals(6, Hex.decode("0xffaabb445566").size) + assertEquals(7, Hex.decode("ffaabb44556677").size) + } + + @Test + fun byteArrayLimitWorks() { + assertEquals("0x", Hex.encode(Hex.decode("00"), limit = 0)) + assertEquals("0x00", Hex.encode(Hex.decode("00"), limit = 1)) + assertEquals("0x", Hex.encode(Hex.decode("ff"), limit = 0)) + assertEquals("0xff", Hex.encode(Hex.decode("ff"), limit = 1)) + assertEquals("0x", Hex.encode(Hex.decode("abcdef"), limit = 0)) + assertEquals("0xab", Hex.encode(Hex.decode("abcdef"), limit = 1)) + assertEquals("0xabcd", Hex.encode(Hex.decode("abcdef"), limit = 2)) + assertEquals("0xabcdef", Hex.encode(Hex.decode("abcdef"), limit = 3)) + assertEquals("0xabcdef", Hex.encode(Hex.decode("abcdef"), limit = 32)) + assertEquals("0xaa12456789bb", Hex.encode(Hex.decode("0xaa12456789bb"), limit = 6)) + assertEquals("0xaa12456789bb", Hex.encode(Hex.decode("0xaa12456789bb"), limit = 9)) } @Test @@ -65,10 +80,10 @@ class TestHex { @Test fun testRoundTrip() { - assertEquals(Hex.encode(Hex.decode("00")), "0x00") - assertEquals(Hex.encode(Hex.decode("ff")), "0xff") - assertEquals(Hex.encode(Hex.decode("abcdef")), "0xabcdef") - assertEquals(Hex.encode(Hex.decode("0xaa12456789bb")), "0xaa12456789bb") + assertEquals("0x00", Hex.encode(Hex.decode("00"))) + assertEquals("0xff", Hex.encode(Hex.decode("ff"))) + assertEquals("0xabcdef", Hex.encode(Hex.decode("abcdef"))) + assertEquals("0xaa12456789bb", Hex.encode(Hex.decode("0xaa12456789bb"))) } @Test