OpenEUICC/libs/lpad-sm-dp-plus-connector/src/main/java/com/truphone/util/TextUtil.kt

123 lines
3.5 KiB
Kotlin

package com.truphone.util
import java.io.InputStream
import java.lang.NumberFormatException
import java.lang.StringBuilder
object TextUtil {
private val HEX_DIGITS = charArrayOf(
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
)
/**
* Converts the given byte array to its hex representation.
*
* @param data The byte array to convert.
* @return Hex-encoded data as a string.
* @see .toHexString
*/
@JvmStatic
fun toHexString(data: ByteArray?): String? {
return if (data == null) null else toHexString(data, 0, data.size)
}
/**
* Converts the given byte array slice to its hex representation.
*
* @param data The byte array to convert.
* @param offset Slice start.
* @param length Slice length.
* @return Hex-encoded data as a string.
*/
@JvmStatic
fun toHexString(data: ByteArray, offset: Int, length: Int): String {
var offset = offset
var length = length
val result = CharArray(length shl 1)
length += offset
var i = 0
while (offset < length) {
result[i++] = HEX_DIGITS[data[offset].toInt() ushr 4 and 0x0F]
result[i++] = HEX_DIGITS[data[offset].toInt() and 0x0F]
++offset
}
return String(result)
}
/*
* Decodes a hex string into a byte array
* Adapted from <https://stackoverflow.com/questions/66613717/kotlin-convert-hex-string-to-bytearray>
*/
@JvmStatic
fun decodeHex(str: String): ByteArray {
if (str.length % 2 == 0) {
throw NumberFormatException("Must have an even length")
}
return str.chunked(2)
.map { it.toInt(16).toByte() }
.toByteArray()
}
/**
* Converts a big-endian representation of ICCID into little-endian
* Big-endian representation is used internally in communication with the SIM.
*
* @param iccid The ICCID to be converted
*/
@JvmStatic
fun iccidBigToLittle(iccid: String): String {
val builder = StringBuilder()
for (i in 0 until iccid.length / 2) {
builder.append(iccid[i * 2 + 1])
if (iccid[i * 2] != 'F') builder.append(iccid[i * 2])
}
return builder.toString()
}
/**
* Converts a little-endian representation of ICCID into big-endian
*
* @param iccid The ICCID to be converted
*/
@JvmStatic
fun iccidLittleToBig(iccidLittle: String): String {
val builder = StringBuilder()
for (i in 0 until iccidLittle.length / 2) {
builder.append(iccidLittle[i * 2 + 1])
builder.append(iccidLittle[i * 2])
}
if (iccidLittle.length % 2 == 1) {
builder.append('F')
builder.append(iccidLittle[iccidLittle.length - 1])
}
return builder.toString()
}
/*
* Read an InputStream into a ByteArray
* This is exposed to the Java side as a convenience
* TODO: Remove when we migrate the full code base to Kotlin
*/
@JvmStatic
fun readInputStream(i: InputStream): ByteArray = i.readBytes()
/*
* TODO: Remove after Kotlin migration
*/
@JvmStatic
fun isNotBlank(str: String): Boolean = str.isNotBlank()
/*
* TODO: Remove after Kotlin migration
*/
@JvmStatic
fun isBlank(str: String): Boolean = str.isBlank()
/*
* TODO: Remove after Kotlin migration
*/
@JvmStatic
fun isNotEmpty(str: String): Boolean = str.isNotEmpty()
}