Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating ByteArray in Kotlin

Tags:

kotlin

People also ask

What is Bytearray in Kotlin?

An array of bytes. When targeting the JVM, instances of this class are represented as byte[] .

How do you get bytes from string in Kotlin?

To convert a string to byte array in Kotlin, use String. toByteArray() method. String. toByteArray() method returns a Byte Array created using the characters of the calling string.


as an option you can create simple function

fun byteArrayOfInts(vararg ints: Int) = ByteArray(ints.size) { pos -> ints[pos].toByte() }

and use it

val arr = byteArrayOfInts(0xA1, 0x2E, 0x38, 0xD4, 0x89, 0xC3)

If all your bytes were less than or equal to 0x7F, you could put them directly:

byteArrayOf(0x2E, 0x38)

If you need to use bytes greater than 0x7F, you can use unsigned literals to make a UByteArray and then convert it back into a ByteArray:

ubyteArrayOf(0xA1U, 0x2EU, 0x38U, 0xD4U, 0x89U, 0xC3U).toByteArray()

I think it's a lot better than appending .toByte() at every element, and there's no need to define a custom function as well.

However, Kotlin's unsigned types are an experimental feature, so you may have some trouble with warnings.


The issue is that bytes in Kotlin are signed, which means they can only represent values in the [-128, 127] range. You can test this by creating a ByteArray like this:

val limits = byteArrayOf(-0x81, -0x80, -0x79, 0x00, 0x79, 0x80)

Only the first and last values will produce an error, because they are out of the valid range by 1.

This is the same behaviour as in Java, and the solution will probably be to use a larger number type if your values don't fit in a Byte (or offset them by 128, etc).


Side note: if you print the contents of the array you've created with toInt calls, you'll see that your values larger than 127 have flipped over to negative numbers:

val bytes = byteArrayOf(0xA1.toByte(), 0x2E.toByte(), 0x38.toByte(), 0xD4.toByte(), 0x89.toByte(), 0xC3.toByte())
println(bytes.joinToString()) // -95, 46, 56, -44, -119, -61